MySQL資料庫Insert語句7種寫法

2021-02-14 MySQL資料庫運維技術棧
簡介

很多開發人員工作了幾年之後,都會自嘲,自己啥技術都沒學到,就會CRUD,可是我要說的是,CRUD你真的都會嗎,你在MySQL資料庫中,會幾種insert語句寫法呢。在這裡我會7種寫法,下面我就來給大家分別介紹一下。

創建測試表

在介紹Insert語句之前,先創建一張測試表

mysql> show create table t_test_2\G;
*************************** 1. row ***************************
Table: t_test_2
Create Table: CREATE TABLE `t_test_2` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL DEFAULT '',
`name2` char(15) NOT NULL DEFAULT '',
`status` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_t_test_1_name2` (`name2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

第一種insert寫法

不指定插入列寫法,這個寫法大家很非常熟悉。

mysql> select * from t_test_2;
Empty set (0.00 sec)

mysql> insert into t_test_2 values(20,'name20','tname20',0);
Query OK, 1 row affected (0.53 sec)

mysql> select * from t_test_2;
+----+---+----+---+
| id | name | name2 | status |
+----+---+----+---+
| 20 | name20 | tname20 | 0 |
+----+---+----+---+
1 row in set (0.00 sec)

可是在這裡,我要告訴大家的是,不實際寫代碼的時候,不建議大家使用這種不指定插入列的insert寫法,為什麼呢,舉個例子,當在表上添加一個新欄位之後,你的insert語句就會報錯,給大家舉個例子

mysql> insert into t_test_3 values(20,'name20','tname20',0);
Query OK, 1 row affected (0.43 sec)

mysql> select * from t_test_3;
+----+---+----+---+
| id | name | name2 | status |
+----+---+----+---+
| 20 | name20 | tname20 | 0 |
+----+---+----+---+
1 row in set (0.00 sec)

mysql> alter table t_test_3 add name3 char(10);
Query OK, 0 rows affected (2.68 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> insert into t_test_3 values(21,'name21','tname21',0);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

看到了吧,執行insert語句報錯了,如果你生產上代碼也是這樣,就是一個故障了。

第二種insert寫法

指定插入列insert語句寫法,寫法如下所示

mysql> insert into t_test_2(id,name,name2,status) values(21,'name21','tname21',0);
Query OK, 1 row affected (0.39 sec)

mysql> select * from t_test_2;
+----+---+----+---+
| id | name | name2 | status |
+----+---+----+---+
| 20 | name20 | tname20 | 0 |
| 21 | name21 | tname21 | 0 |
+----+---+----+---+
2 rows in set (0.00 sec)

第三種insert寫法

一次插入多行記錄,寫法如下所示,在這裡,一次插入2條記錄,當有批量插入的業務情景,這個insert寫法就很方便了。

mysql> insert into t_test_2 values(22,'name22','tname22',0),(23,'name23','tname23',0);
Query OK, 2 rows affected (0.37 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from t_test_2;
+----+---+----+---+
| id | name | name2 | status |
+----+---+----+---+
| 20 | name20 | tname20 | 0 |
| 21 | name21 | tname21 | 0 |
| 22 | name22 | tname22 | 0 |
| 23 | name23 | tname23 | 0 |
+----+---+----+---+
4 rows in set (0.01 sec)

第四種insert寫法

帶select查詢的insert語句,這種寫法,可以很方便的在線備份一張表的記錄

mysql> insert into t_test_2 select * from t_test_1;
Query OK, 10 rows affected (0.33 sec)
Records: 10 Duplicates: 0 Warnings: 0

mysql> select * from t_test_2;
+----+---+----+---+
| id | name | name2 | status |
+----+---+----+---+
| 1 | name1 | 1001 | 0 |
| 2 | name1 | 1002 | 1 |
| 3 | name1 | 1003 | 1 |
| 4 | name1 | 1004 | 0 |
| 5 | name1 | 1005 | 1 |
| 6 | name1 | 1006 | 0 |
| 7 | name1 | 1007 | 2 |
| 8 | name1 | 1008 | 0 |
| 9 | name1 | 1009 | 1 |
| 10 | name10 | 1001 | 0 |
| 20 | name20 | tname20 | 0 |
| 21 | name21 | tname21 | 0 |
| 22 | name22 | tname22 | 0 |
| 23 | name23 | tname23 | 0 |
+----+---+----+---+
14 rows in set (0.01 sec)

第五種insert寫法

當用replace into向業務表中插入數據時,會依據主鍵或者唯一索引進行判斷,是否存在衝突,如果存在,就會先刪除衝突行,然後插入新的記錄。如果不衝突,則直接將記錄插入到業務表。需要注意的是,想要replace into,用戶對表必須有insert,delete權限,在管理嚴格線上資料庫,會禁止普通應用用戶擁有delete權限。

舉個例子,當你插入的數據發生主鍵衝突時,就可以使用replace into來解決了。下面來舉個例子

mysql> select * from t_test_2 where id=1;
+----+--+--+---+
| id | name | name2 | status |
+----+--+--+---+
| 1 | name1 | 1001 | 0 |
+----+--+--+---+
1 row in set (0.00 sec)

mysql> replace into t_test_2 (id,name,name2,status) values(1,'testea','testea',1);
Query OK, 2 rows affected (0.16 sec)

mysql> select * from t_test_2 where id=1;
+----+---+---+---+
| id | name | name2 | status |
+----+---+---+---+
| 1 | testea | testea | 1 |
+----+---+---+---+
1 row in set (0.00 sec)

第六種insert寫法

當用insert ignore向業務表插入數據時,會依據主鍵或者唯一索引進行判斷,是否存在衝突,就跳過要插入的數據,如果不衝突,則直接將記錄插入到業務表。

舉一個業務場景,當你向表裡插入記錄,可是有些數據可能會與表裡的記錄發生主鍵衝突,而發生衝突的記錄,你不想導入,這個時候,insert ignore就能幫上大忙了。舉個實際例子

mysql> insert ignore into t_test_2 (id,name,name2,status) values(1,'testea','testea',1),(30,'teste30','teste30',1);
Query OK, 1 row affected, 1 warning (0.34 sec)
Records: 2 Duplicates: 1 Warnings: 1

mysql> select * from t_test_2 where id in (1,30);
+----+----+----+---+
| id | name | name2 | status |
+----+----+----+---+
| 1 | testea | testea | 1 |
| 30 | teste30 | teste30 | 1 |
+----+----+----+---+
2 rows in set (0.01 sec)

第七種insert寫法

當用insert on duplicate key update向業務表插入數據時,會依據主鍵或者唯一索引進行判斷,是否存在衝突,則會更新指定欄位,如果不衝突,則直接將記錄插入到業務表。

舉個例子

mysql> select * from t_test_2 where id in (1,31);
+----+---+---+---+
| id | name | name2 | status |
+----+---+---+---+
| 1 | testea | testea | 1 |
+----+---+---+---+
1 row in set (0.00 sec)

mysql> insert into t_test_2 (id,name,name2,status) values(1,'testea','testea',1) on duplicate key update status=4;
Query OK, 2 rows affected (0.32 sec)

mysql> insert into t_test_2 (id,name,name2,status) values(31,'testea31','testea31',1) on duplicate key update status=4;
Query OK, 1 row affected (0.14 sec)

mysql> select * from t_test_2 where id in (1,31);
+----+++---+
| id | name | name2 | status |
+----+++---+
| 1 | testea | testea | 4 |
| 31 | testea31 | testea31 | 1 |
+----+++---+
2 rows in set (0.00 sec)

關注

相關焦點

  • MySQL實戰中,Insert語句的使用心得總結
    情景示例:這張表存的每個客戶最近一次交易訂單信息,要求保證單個用戶數據不重複錄入,且執行效率最高,與資料庫交互最少,支撐資料庫的高可用。此時,可以使用"REPLACE INTO"語句,這樣就不必先查詢,再決定是否先刪除再插入。"REPLACE INTO"語句是基於唯一索引或主鍵來判斷唯一(是否存在)的。
  • MySQL實戰中的Insert語句的使用心得
    前言: 提到MySQL的Insert語句,大家肯定不陌生,可以張口就來:不就是insert into table values(xxx,xxx,xxx)嘛!情景示例:這張表存的每個客戶最近一次交易訂單信息,要求保證單個用戶數據不重複錄入,且執行效率最高,與資料庫交互最少,支撐資料庫的高可用。此時,可以使用"REPLACE INTO"語句,這樣就不必先查詢,再決定是否先刪除再插入。
  • MySQL INSERT的4種形態
    墨墨導讀:MySQL中常用的四種插入數據的語句:insert ,insert select,replace into
  • MySQL資料庫筆記
    DOS命令窗口方式啟動:net start mysql<3>DOS命令窗口方式停止:net stop mysql 切記不要加分號登錄MySQL資料庫:mysql -uroot -p 回車 輸入密碼登錄MySQL資料庫:mysql -uroot -p密碼 回車
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    查看資料庫資料庫創建好後,使用show語句查看當前mysql中有哪些資料庫。刪除資料庫使用drop語句刪除資料庫,語法格式如下:刪除創建的web資料庫,命令如下:刪除資料庫是一個不可逆的操作。mysql數據表管理創建數據表使用create table語句,語法格式如下。
  • MySQL的SQL語句 - 數據操作語句(7)- INSERT SELECT 語句
    SELECT 語句,可以從 SELECT 語句的結果中快速地將許多行插入到表中,該語句可以從一個或多個表中進行選擇。FROM t 語句。因為在同一語句中不能引用兩次臨時表。出於同樣的原因,當t是臨時表時,不能使用 INSERT INTO t ... TABLE t 語句。● 為了確保二進位日誌可以用來重新創建原始表,MySQL 不允許 INSERT ... SELECT 或 INSERT ... TABLE 語句並發插入。
  • 如何使用MySQL資料庫
    需要指定「庫名.表名」作為參數;若只指定表名參數,則需要先通過「use語句」切換到目標庫。如下圖:查看mysql庫中的user表的結構。3.創建及刪除庫和表1)創建新的庫「create database語句」:用於創建一個新的庫,需指定資料庫名稱作為參數。
  • python對mysql資料庫的操作(一)
    本文章介紹python對mysql資料庫的基本操作,以及編寫一個模擬用戶的註冊。
  • DBA必備技能,mysql權限管理(DCL語句)
    只會資料庫是否能拿到高工資?可以,這個職業很厲害就是傳說中的DBA,開發很多,DBA不多。今天要講的內容跟DBA有很大關係,想做DBA權限管理是很重要的,今天就講一下mysql中的權限管理。一、用戶管理;1、切換資料庫;如下圖所示,將界面切換至命令界面;輸入命令use mysql;這句代碼意思是切換資料庫,切換到mysql這個資料庫下面,因為用戶信息在mysql下的user表內存儲著。
  • 新手入門MYSQL資料庫命令大全
    一、命令行連接資料庫Windows作業系統進入CMD命令行,進入mysql.exe所在目錄,運行命令mysql.exe -h主機名 -u用戶名 -p密碼注意:參數名與值之間沒有空格 , 如:-h127.0.0.1
  • MySQL的SQL語句 - 資料庫管理語句 - 帳戶管理語句 - GRANT 語句 (3)
    在執行 GRANT 語句之後註冊的動態權限不會追溯到任何帳戶。MySQL 將全局權限存儲在 mysql.user 系統表。資料庫權限應用於給定資料庫中的所有對象。如果沒有默認資料庫,則會發生錯誤。可以在資料庫級別指定 CREATE、DROP、EVENT、GRANT OPTION、LOCK TABLES 和 REFERENCES 權限。表或例程權限也可以在資料庫級別指定,在這種情況下,它們應用於資料庫中的所有表或例程。MySQL 將資料庫權限存儲在 mysql.db 系統表。表權限應用於給定表中的所有列。
  • 基於MySQL的高性能資料庫應用開發
    szSqlText, //構造SQL語句 "create table mytable " //新建一張表 "(time datetime, s1 char(6), " "s2 char(11), s3 int, s4 int)"); if (mysql_query( myData, szSqlText)) //執行SQL語句 {//執行SQL語句出錯
  • MySQL mysqldump 數據導出詳解
    CREATE TABLE b1(id int);insert into b1() values(1);CREATE TABLE b2(id int);insert into b2() values(2);1.導出所有資料庫該命令會導出包括系統資料庫在內的所有資料庫mysqldump
  • MySQL 資料庫「十宗罪」(十大經典錯誤案例)
    50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;獲取到 sql 語句之後,就可以在從庫反向執行 sql 語句。把從庫缺少的 sql 語句補全,解決報錯信息。目前是進入不了資料庫的情況,所以我們要考慮是不是可以跳過權限。因為在資料庫中,mysql資料庫中user表記錄著我們用戶的信息。/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf  --skip-grant-tables &這樣啟動,就可以不用輸入密碼,直接進入 mysql 資料庫了。
  • MySQL的SQL語句 - 資料庫管理語句 - 帳戶管理語句 - REVOKE 語句
    只有所有指定用戶和角色都成功時,該語句才會被寫入二進位日誌。要使用第一種 REVOKE 語法,必須擁有 GRANT OPTION 權限,並且必須擁有要撤銷的權限。要撤銷所有權限,請使用第二種語法,它刪除指定用戶或角色的所有全局、資料庫、表、列和例程權限:REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_or_role [, user_or_role] ...
  • MySQL的insert into select 引發鎖表
    into t values(null, 1,1);insert into t values(null, 2,2);insert into t values(null, 3,3);insert into t values(null, 4,4);create table t2 like t;執行begin;insert
  • Mysql資料庫部分
    在筆試題最後一般都是有一道關於mysql語句的問題,讓手寫出增、刪、改、查語句,今天我們就學習一下mysql語句。例如:語句7:WHERE條件獨立。語句8:將語句7中的WHERE條件放到ON後面。從語句7和語句8查詢的結果來看,顯然是不相同的,語句8顯示的結果是難以理解的。因此,推薦在寫連接查詢的時候,ON後面只跟連接條件,而對中間表限制的條件都寫到WHERE子句中。
  • Python連接MySQL資料庫方法介紹(超詳細!手把手項目案例操作)
    >Python 3.7.2pip 19.0.3兩種方法進行資料庫的連接分別是PyMySQL和mysql.connector步驟:連接資料庫執行結果如下:('a', '趙大', '16')('b', '錢二', '16')mysql.connectormysql-connector-python:是MySQL官方的純Python驅動;mysql.connector
  • MySQL三天快速完整複習
    標準的sql適合於所有的資料庫產品。SQL屬於高級語言。只要能看懂英語單詞的,寫出來的sql語句,可以讀懂什麼意思。SQL語句在執行的時候,實際上內部也會先進行編譯,然後再執行sql。(sql語句的編譯由DBMS完成。)DBMS負責執行sql語句,通過執行sql語句來操作DB當中的數據。
  • 「詳細」MySQL資料庫與JDBC編程
    索引(一個資料庫對象)視圖DML(Data Definition Language,數據定義語言)語句insert into語句update語句delete fromMySQL重命名數據表ALTER TABLE 表名 rename to 新表名;MySQL修改列名ALTER TABLE 表名 CHANGE 列名 新列名 type [default expr] [first|afterColName]資料庫約束5種完整性約束