前提要述:參考書籍《MySQL必知必會》
《MySQL必知必會》是先講了查詢,但是沒有記錄就無法查詢,所以先將如何添加資料,
表已經知道怎么創建了,隨便創兩張,
5.1 插入資料
MySQL使用 INSERT來插入(或添加)行(記錄)到資料庫表中,插入可用以下幾種方式使用:
- 插入完整的行(記錄);
- 插入行的一部分;
- 插入多行;
- 插入某些查詢結果,
5.2 插入完整的行(記錄)
什么叫完整的行,即插入的有效資料都可以對應表中的每一列,
把資料插入表中,最簡單的方法是使用基本的INSERT語法,需要指定表名和被插入到新行中的值,格式:
# 寫法:
INSERT INTO <table_name> VALUES(value1,value2,...);
# 規范寫法:
INSERT INTO <table_name>(field1, field2, ...) VALUES(value1,value2,...);
解釋:
- 如果使用第一種寫法,雖然很簡單,但是并不安全,應該盡量避免使用,因為該陳述句高度依賴于表中列的次序,并且還依賴其次序容易獲得的資訊,即使可得到這種次序資訊,也不能保證下次表結構變動后各個列保持完全相同的次序,所以在開發中如果這樣寫,那么就是把插入陳述句寫死了,因為資料庫表中的列的順序有可能可能會改變,一旦改變,就會出現致命錯誤,比如:一個varchar型別的可能會被插入到char中,如果超長度可能會報錯,而且varchar是大范圍而char是小范圍,可能會導致資料丟失;而如果一個浮點型的資料因為列順序的改變插入到了一個整型的列中,這又不會報錯,所以也很難找錯,
- 推薦使用規范寫法,特別是在開發時撰寫sql陳述句,因為一旦指定列名,那么VALUES必須以其指定的次序匹配指定的列名,不一定按各個列出現在實際表中的次序, 所以即使表的結構改變,此INSERT陳述句仍然可以正確作業,
- 第一種寫法必須完整的給出表中的全部列的值,并且還得按照表中列的次序;而規范寫法不用,因為會根據<table_name>(field1, field2, ...)來進行賦值,即使跟表中的列的次序不一樣,或者一些列不想賦值,
例子:在學生表中插入資料
INSERT INTO student(stu_id, stu_name, stu_sex) VALUES(1, '張三', '男');
注意:字串或字符需要使用''(單引號)圈起來,
輸出:如果成功的話
Query OK, 1 row affected (0.01 sec)
而如果在主鍵使用了自增長(AUTO_INCREMENT),那么則可以這樣寫
INSERT INTO student(stu_id, stu_name, stu_sex) VALUES(null, '張三', '男');
或者,不寫主鍵:
INSERT INTO student(stu_name, stu_sex) VALUES('張三', '男');
也就是插入時,在主鍵的位置直接插入null或者不寫默認就是賦給null,MySQL會因為AUTO_INCREMENT自己給它賦值,
- 如果對表中不允許NULL值且沒有默認值的列不給出值(插入時省略了),則MySQL將產生一條錯誤資訊,并且相應的行插入不成功,
- 規范寫法哪些列可以省略不寫:
- 該列定義為允許NULL值(無值或空值);
- 在表定義中給出默認值,也就表示如果在插入時不給出值,就會使用默認值;
- 使用AUTO_INCREMENT的列,
- INSERT操作可能很耗時(特別是有很多索引需要更新時),而且它可能降低等待處理的SELECT陳述句的性能,如果資料檢索是最重要的,則可以通過在INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL降低INSERT陳述句的優先級,
INSERT LOW_PRIORITY INTO
- UPDATE操作和DELETE操作也適用,
5.3 插入多個行
INSERT可以插入一行到一個表中,也可以插入多行到一個表中,第一種方式就是寫多條INSERT陳述句,還有一種方式就是在一條INSERT陳述句中插入多行,
語法:
INSERT INTO <table_name>(
field1,
field2,
...
)
VALUES(
valueA1,
valueA2,
...
),
(
valueB1,
valueB2,
...
);
此寫法可以提供INSERT的性能,因為MySQL用單條INSERT陳述句處理多個插入比使用多條INSERT快,
5.4 插入檢索出的資料
INSERT陳述句可以利用一條SELECT陳述句查詢的結果插入到表中,也就是所謂的INSERT SELECT,它是由一條INSERT陳述句和一條SELECT陳述句構成,
比如我需要把一張表的資料復制到另一張表,語法:
INSERT INTO <new_table_name>(field1, field2, ...)
SELECT field1, field2 FROM <old_table_name>;
# 或 也就是列名可以不同
INSERT INTO <new_table_name>(field1, field2, ...)
SELECT f1, f2 FROM <old_table_name>;
注意:如果新表不存在則報錯,
解釋:
- 先使用SELECT陳述句從舊表中查詢出資料,然后再使用INSERT陳述句把查詢的結果插入到新表中,
- SELECT列出的每一個列對應于<new_table_name>后所跟的串列中的每一個列,
- 如果<old_table_name>為空,即沒有行可以插入也不會報錯,
- 如果能保證從舊表匯入到新表(假設新表有資料)的主鍵值不會重復,那么插入時可以省略這主鍵,比如有AUTO_INCREMENT的主鍵就可以省略,
- 在INSERT和SELECT陳述句中使用相同的列名,但是不一定要求列名匹配,實際上,MySQL甚至不關心SELECT回傳的列名,它使用的是列的位置,因此SELECT中的第一列(不管列名)將用來填充表列中指定的第一個列,第二列將用來填充表列中指定的第二列等,
- INSERT SELECT中SELECT陳述句可包含WHERE子句以過濾插入的資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/87451.html
標籤:MySQL
上一篇:mysql常見問題解決方案
