《MySQL 入門教程》第 23 篇 DML 語句之插入數據

文章來源:https://blog.csdn.net/horses/article/details/108287687

原文作者:不剪髮的Tony老師

來源平臺:CSDN

數據庫的基本操作包括增、刪、改、查,在前面的篇章中主要介紹了 SELECT 語句;接下來幾篇我們學習一下數據的修改操作,首先是如何插入數據,也就是INSERT語句。

《MySQL 入門教程》第 23 篇 DML 語句之插入數據

23.1 插入單條記錄

MySQL 主要使用 INSERT 語句插入數據,基本的語法如下:

<code>INSERT INTO table_name(col1, col2, ...)
VALUES (val1, val2, ...);/<code>

其中,table_name 是表名;VALUES子句中提供的值與INSERT INTO中的字段數量必須相同,並且數據類型能夠兼容。例如:

<code>INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 26, '張三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, '[email protected]');/<code>

以上語句為 employee 表增加了一名新員工。如果 VALUES 值列表與表中的字段順序完全一致,可以省略字段列表;因此上面的語句也可以簡寫成:

<code>INSERT INTO employee
VALUES ( 26, '張三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, '[email protected]');/<code>

如果同時執行了上面的兩個插入語句,第二次執行時將會產生主鍵衝突的錯誤。因為數據庫在插入數據之前將會執行完整性檢查,對於違反約束的數據提示錯誤,而不會生成新的數據。以下兩個語句分別違反了外鍵約束和非空約束:

<code>INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 27, '李四', '男', 5, 18, '2019-12-25', 0, 6000, NULL, '[email protected]');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`hrdb`.`employee`, CONSTRAINT `fk_emp_job` FOREIGN KEY (`job_id`) REFERENCES `job` (`job_id`))

INSERT INTO employee(emp_id)

VALUES ( 28 );
ERROR 1364 (HY000): Field 'emp_name' doesn't have a default value/<code>

MySQL 為 INSERT 語句提供了一個IGNORE選項,可以忽略插入數據時的錯誤,當然也不會創建新的數據行。例如:

<code>INSERT IGNORE INTO employee
VALUES ( 26, '張三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, '[email protected]');
Query OK, 0 rows affected, 1 warning (0.00 sec)

show warnings;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1062 | Duplicate entry '26' for key 'employee.PRIMARY' |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)/<code>

如果某個字段可空或者定義了默認值,插入數據時可以不指定該字段,或者指定 default,表示使用默認值。例如:

<code>CREATE TABLE t(id int NOT NULL DEFAULT 100);
INSERT INTO t VALUES ();
INSERT INTO t VALUES (default);

SELECT * FROM t;
id |
---|
100|
100|/<code>

MySQL 還提供了另一種形式的 INSERT 語法,通過SET子句設置字段的值:

<code>INSERT INTO table_name
SET col1 = val1,
col2 = val2,
/<code>

例如:

<code>INSERT INTO t  

SET id = 1;/<code>

如果表中存在 AUTO_INCREMENT 自增字段,每次執行插入操作之後可以使用 LAST_INSERT_ID() 函數返回最後一條記錄的 id。例如:

<code>DROP TABLE IF EXISTS t;
CREATE TABLE t(id int AUTO_INCREMENT NOT NULL PRIMARY KEY, c1 int);

INSERT INTO t(c1) VALUES (123);
SELECT last_insert_id();
last_insert_id()|
----------------|
1|/<code>

23.2 插入多條記錄

MySQL 中的 INSERT 語句支持一次插入多條記錄,只需要在 VALUES 子句後指定多個數據行即可。

<code>INSERT INTO table_name(col1, col2, ...)
VALUES (val11, val12, ...), (val21, val22, ...), ...;
12/<code>

例如以下語句一次新增了 3 名員工:

<code>INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 27, '李四', '女', 5, 18, current_date, 10, 6000, NULL, '[email protected]'),
( 28, '王五', '男', 5, 18, current_date, 10, 6500, NULL, '[email protected]'),
( 29, '趙六', '女', 5, 18, current_date, 10, 6700, NULL, '[email protected]');/<code>

理論上來說,可以一次插入任意多行數據,但是每個語句的長度不能超過系統變量 max_allowed_packet 的大小。改變量的值可以使用以下語句查看:

<code>SHOW VARIABLES LIKE 'max_allowed_packet';
Variable_name |Value |
------------------|-------|
max_allowed_packet|4194304|/<code>

如果有必要,可以使用 SET 命令修改該參數的值。

插入多行數據時,LAST_INSERT_ID() 函數將會返回插入的第一個 AUTO_INCREMENT 值,而不是最後一行數據對應的 id。

23.3 插入查詢結果

除了手動指定插入的數據之外,MySQL 也支持插入一個 SELECT 語句的查詢結果。

<code>INSERT INTO table_name(col1, col2, ...)
SELECT ...;/<code>

其中,SELECT 子句可以包含任何操作,例如分組聚合、排序、連接查詢、子查詢等。

我們先創建一個新表 emp_devp:

<code>CREATE TABLE emp_devp
( emp_id INTEGER NOT NULL PRIMARY KEY
, emp_name VARCHAR(50) NOT NULL
, sex VARCHAR(10) NOT NULL
, dept_id INTEGER NOT NULL
, manager INTEGER
, hire_date DATE NOT NULL
, job_id INTEGER NOT NULL
, salary NUMERIC(8,2) NOT NULL
, bonus NUMERIC(8,2)
, email VARCHAR(100) NOT NULL
) ;/<code>

然後通過一個查詢語句,將研發部的員工信息複製到 emp_devp 表中:

<code>INSERT INTO emp_devp(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
SELECT *
FROM employee
WHERE dept_id = (SELECT dept_id FROM department WHERE dept_name = '研發部');


SELECT count(*) FROM emp_devp;
count(*)|
--------|
9|/<code>

這種形式的插入語法可以實現表的數據複製,通常用於數據倉庫中的 ETL(抽取、轉換和加載)或者生成測試數據。


對了,在這裡說一下,我目前是在職Java開發,如果你現在正在學習Java,瞭解Java,渴望成為一名合格的Java開發工程師,在入門學習Java的過程當中缺乏基礎入門的視頻教程,可以關注並私信我:01。獲取。我這裡有最新的Java基礎全套視頻教程。


分享到:


相關文章: