前提要述:參考書籍《MySQL必知必會》 《MySQL必知必會》是先講了查詢,但是沒有記錄就無法查詢,所以先將如何添加數據。 表已經知道怎麼創建了,隨便創兩張。 5.1 插入數據 MySQL使用 INSERT來插入(或添加)行(記錄)到資料庫表中。插入可用以下幾種方式使用: 插入完整的行(記錄); ...
前提要述:參考書籍《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語句仍然可以正確工作。
- 第一種寫法必須完整的給出表中的全部列的值,並且還得按照表中列的次序;而規範寫法不用,因為會根據
(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列出的每一個列對應於
後所跟的列表中的每一個列。 - 如果
為空,即沒有行可以插入也不會報錯。 - 如果能保證從舊表導入到新表(假設新表有數據)的主鍵值不會重覆,那麼插入時可以省略這主鍵,比如有AUTO_INCREMENT的主鍵就可以省略。
- 在INSERT和SELECT語句中使用相同的列名,但是不一定要求列名匹配。實際上,MySQL甚至不關心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管列名)將用來填充表列中指定的第一個列,第二列將用來填充表列中指定的第二列等。
- INSERT SELECT中SELECT語句可包含WHERE子句以過濾插入的數據。