- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者賬戶
- MySQL - 解鎖使用者賬戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 截斷表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - 插入查詢
- MySQL - 選擇查詢
- MySQL - 更新查詢
- MySQL - 刪除查詢
- MySQL - 替換查詢
- MySQL - 插入忽略
- MySQL - 在重複鍵更新時插入
- MySQL - 插入到選擇中
- MySQL 運算子和子句
- MySQL - Where 子句
- MySQL - Limit 子句
- MySQL - Distinct 子句
- MySQL - Order By 子句
- MySQL - Group By 子句
- MySQL - Having 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - Like 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - 不等於運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - Between 運算子
- MySQL - UNION 運算子
- MySQL - UNION 與 UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - 內連線
- MySQL - 左連線
- MySQL - 右連線
- MySQL - 交叉連線
- MySQL - 全連線
- MySQL - 自連線
- MySQL - 刪除連線
- MySQL - 更新連線
- MySQL - Union 與 Join
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - 插入前觸發器
- MySQL - 插入後觸發器
- MySQL - 更新前觸發器
- MySQL - 更新後觸發器
- MySQL - 刪除前觸發器
- MySQL - 刪除後觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式和運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 雜項概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入到資料庫
- MySQL - UUID
- MySQL - 公共表表達式
- MySQL - On Delete Cascade
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - 訊號
- MySQL - 重新發送訊號
- MySQL - 字元集
- MySQL - 校對
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 今天日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - Explain
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - 顯示 Processlist
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - Coalesce() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - 插入忽略
在 MySQL 中,**INSERT INTO** 語句可用於將一條或多條記錄插入表中。
在某些情況下,如果某個特定列具有 UNIQUE 約束,並且我們嘗試使用 INSERT INTO 語句將重複記錄新增到該特定列中,MySQL 將終止該語句並返回錯誤。結果,沒有行插入到表中。
MySQL Insert Ignore 語句
但是,如果我們使用 MySQL **INSERT IGNORE INTO** 語句,它不會顯示錯誤。相反,它允許我們將有效資料插入表中,並忽略會導致錯誤的無效資料行。
以下是 INSERT IGNORE INTO 語句避免錯誤的一些場景
- 當我們在具有 UNIQUE 鍵或 PRIMARY 鍵約束的表的列中插入重複值時。
- 當我們嘗試向具有 NOT NULL 約束的列新增 NULL 值時。
語法
以下是 MySQL 中 INSERT IGNORE 語句的語法:
INSERT IGNORE INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
示例
首先,讓我們使用以下查詢建立一個名為 CUSTOMERS 的表:
**注意:**UNIQUE 約束確保 NAME 列中不能儲存或插入重複值。
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL UNIQUE, PRIMARY KEY (ID) );
以下查詢將三條記錄插入 CUSTOMERS 表中:
INSERT INTO CUSTOMERS (ID, NAME) VALUES (1, "Ajay"), (2, "Vinay"), (3, "Arjun");
執行以下查詢以顯示 CUSTOMERS 表中存在的記錄:
SELECT * FROM CUSTOMERS;
以下是 CUSTOMERS 表的記錄:
| ID | NAME |
|---|---|
| 1 | Ajay |
| 2 | Arjun |
| 3 | Vinay |
現在,讓我們使用以下查詢將重複記錄插入 CUSTOMERS 表的 NAME 列中:
INSERT INTO CUSTOMERS (NAME) VALUES (2, "Arjun");
它返回錯誤,因為“Arjun”已經存在於該列中,因此違反了 UNIQUE 約束。
ERROR 1062 (23000): Duplicate entry 'Arjun' for key 'customers.NAME'
現在,讓我們使用 **INSERT IGNORE** 語句,如下所示:
INSERT IGNORE INTO CUSTOMERS (NAME) VALUES (2, "Arjun");
輸出
雖然我們正在插入重複值,但它不會顯示任何錯誤,而是會發出警告。
Query OK, 0 rows affected, 1 warning (0.00 sec)
我們可以使用以下查詢查詢上述警告的詳細資訊:
SHOW WARNINGS;
以下是警告表:
| 級別 | 程式碼 | 訊息 |
|---|---|---|
| 警告 | 1062 | 鍵“customers.NAME”的重複條目“Arjun” |
驗證
如果我們嘗試驗證 CUSTOMERS 表,我們會發現我們嘗試插入的重複行不會出現在表中。
SELECT * FROM CUSTOMERS;
上面程式的輸出如下所示:
| ID | NAME |
|---|---|
| 1 | Ajay |
| 2 | Arjun |
| 3 | Vinay |
MySQL INSERT IGNORE 和 STRICT 模式
嚴格模式控制 MySQL 如何處理將透過資料更改語句(如 **INSERT** 或 **UPDATE**)新增到表中的無效、缺失或超出範圍的值。
因此,如果嚴格模式為 **ON**,並且我們嘗試使用 INSERT 語句將一些無效值插入表中,MySQL 將終止該語句並返回錯誤訊息。
但是,如果我們使用 INSERT IGNORE INTO 語句,MySQL 不會返回錯誤,而是會調整這些值以使其在將值新增到表之前有效。
示例
讓我們使用以下查詢建立一個名為 CUSTOMERS 的表:
**注意:**NAME 列僅接受長度小於或等於 5 的字串。
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(5), PRIMARY KEY (ID) );
這裡,我們嘗試將長度大於 5 的值插入 NAME 列。
INSERT INTO CUSTOMERS (NAME) VALUES (1, "Malinga");
它返回如下所示的錯誤:
ERROR 1406 (22001): Data too long for column 'NAME' at row 1
現在,我們嘗試使用 **INSERT IGNORE** 語句插入相同的字串:
INSERT IGNORE INTO CUSTOMERS (NAME) VALUES (1, "Malinga");
輸出
正如我們在輸出中看到的,它不會返回錯誤,而是顯示警告:
Query OK, 1 row affected, 1 warning (0.01 sec)
讓我們使用以下命令查詢上述警告的詳細資訊:
SHOW WARNINGS;
正如我們在下面的輸出中看到的,MySQL 在將其插入 CUSTOMERS 表之前截斷了資料。
| 級別 | 程式碼 | 訊息 |
|---|---|---|
| 警告 | 1265 | 第 1 行的“NAME”列資料被截斷 |
驗證
執行以下查詢以驗證 CUSTOMERS 表的記錄:
Select * from CUSTOMERS;
如我們在下面的 CUSTOMERS 表中看到的,該值已被截斷為 5 個字元並插入到表中。
| ID | NAME |
|---|---|
| 1 | Malin |
使用客戶端程式插入忽略查詢
除了使用 MySQL 查詢執行 Insert Ignore 操作外,我們還可以使用 Node.js、PHP、Java 和 Python 等客戶端程式來實現相同的結果。
語法
以下是此操作在各種程式語言中的語法:
要透過 PHP 程式將有效資料插入 MySQL 表中,我們使用 'IGNORE' 以及 'INSERT INTO' 語句,並使用 mysqli 函式 query(),如下所示:
$sql = "INSERT IGNORE INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...)"; $mysqli->query($sql);
要透過 Node.js 程式將有效資料插入 MySQL 表中,我們使用 'IGNORE' 以及 'INSERT INTO' 語句,並使用 mysql2 庫的 query() 函式,如下所示:
sql = "INSERT IGNORE INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...)"; con.query(sql);
要透過 Java 程式將有效資料插入 MySQL 表中,我們使用 'IGNORE' 以及 'INSERT INTO' 語句,並使用 JDBC 函式 executeUpdate(),如下所示:
String sql = "INSERT IGNORE INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...)"; statement.executeUpdate(sql);
要透過 Python 程式將有效資料插入 MySQL 表中,我們使用 'IGNORE' 以及 'INSERT INTO' 語句,並使用 MySQL Connector/Python 的 execute() 函式,如下所示:
insert_ignore_query = "INSERT IGNORE INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)" cursorObj.execute(insert_ignore_query)
示例
以下是程式:
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli->connect_errno ) {
printf("Connect failed: %s
", $mysqli->connect_error);
exit();
}
//printf('Connected successfully.
');
$sql = "INSERT IGNORE INTO tutorials_tbl values(5, 'Java Tutorial', 'newauther3', '2022-11-15')";
if($result = $mysqli->query($sql)){
printf("Data inserted successfully..!");
}
$q = "SELECT * FROM tutorials_tbl where tutorial_id = 5";
if($res = $mysqli->query($q)){
printf("Records after insert ignore statement: ");
while($row = mysqli_fetch_row($res)){
print_r ($row);
}
}
if($mysqli->error){
printf("Failed..!" , $mysqli->error);
}
$mysqli->close();
輸出
獲得的輸出如下:
Data inserted successfully..!Records after insert ignore statement: Array ( [0] => 5 [1] => Java Tutorial [2] => newauther3 [3] => 2022-11-15 )
var mysql = require('mysql2');
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "Nr5a0204@123"
});
//Connecting to MySQL
con.connect(function (err) {
if (err) throw err;
console.log("Connected!");
//Selecting a Database
sql = "USE TUTORIALS"
con.query(sql);
//Creating Table
sql = "CREATE TABLE STUDENTS (ID int AUTO_INCREMENT,NAME varchar(5) NOT NULL UNIQUE,PRIMARY KEY (ID));"
con.query(sql);
sql = "INSERT INTO STUDENTS (NAME) VALUES ('Ajay'), ('Vinay'), ('Arjun');"
con.query(sql);
sql= "INSERT IGNORE INTO STUDENTS (NAME) VALUES ('Arjun');"
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
console.log("----------------------------------------");
});
sql = "SHOW WARNINGS;"
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
console.log("----------------------------------------");
});
sql = "SELECT * FROM STUDENTS;"
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
});
});
輸出
生成的輸出如下:
Connected!
ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 2,
warningStatus: 1,
changedRows: 0
}
----------------------------------------
[
{
Level: 'Warning',
Code: 1062,
Message: "Duplicate entry 'Arjun' for key 'students.NAME'"
}
]
----------------------------------------
[
{ ID: 1, NAME: 'Ajay' },
{ ID: 3, NAME: 'Arjun' },
{ ID: 2, NAME: 'Vinay' }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class InsertIgnore {
public static void main(String[] args) {
String url = "jdbc:mysql://:3306/TUTORIALS";
String user = "root";
String password = "password";
ResultSet rs;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection(url, user, password);
Statement st = con.createStatement();
//System.out.println("Database connected successfully...!");
String sql = "SELECT * FROM STUDENTS";
rs = st.executeQuery(sql);
System.out.println("Table records before insert ignore: ");
while(rs.next()) {
String Id = rs.getString("Id");
String Name = rs.getString("Name");
System.out.println("Id: " + Id + ", Name: " + Name);
}
String sql1 = "INSERT INTO STUDENTS (NAME) VALUES (\"Arjun\")";
st.executeUpdate(sql1);
System.out.println("Record with name 'Arjun' inserted successfully...!");
String sql2 = "SELECT * FROM STUDENTS";
rs = st.executeQuery(sql2);
System.out.println("Table record after insert: ");
while(rs.next()) {
String Id = rs.getString("Id");
String Name = rs.getString("Name");
System.out.println("Id: " + Id + ", Name: " + Name);
}
//now let use insert ignore query to insert a duplicate records into the Students table
String sql3 = "INSERT IGNORE INTO STUDENTS (NAME) VALUES (\"Arjun\")";
st.executeUpdate(sql3);
System.out.println("Insert ignore query executed successfully....!");
String sql4 = "SELECT * FROM STUDENTS";
rs = st.executeQuery(sql4);
System.out.println("Table records after insert ingore: ");
while(rs.next()) {
String Id = rs.getString("Id");
String Name = rs.getString("Name");
System.out.println("Id: " + Id + ", Name: " + Name);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
輸出
獲得的輸出如下所示:
Table records before insert ignore: Id: 1, Name: Ajay Id: 2, Name: Vinay Record with name 'Arjun' inserted successfully...! Table record after insert: Id: 1, Name: Ajay Id: 9, Name: Arjun Id: 2, Name: Vinay Insert ignore query executed successfully....! Table records after insert ingore: Id: 1, Name: Ajay Id: 9, Name: Arjun Id: 2, Name: Vinay
import mysql.connector
#establishing the connection
connection = mysql.connector.connect(
host='localhost',
user='root',
password='password',
database='tut'
)
cursorObj = connection.cursor()
insert_ignore_query = "INSERT IGNORE INTO tutorials_tbl (tutorial_id, tutorial_title, tutorial_author, submission_date) VALUES (7, 'New Tutorial', 'John Doe', '2023-07-25')"
cursorObj.execute(insert_ignore_query)
connection.commit()
print("INSERT IGNORE query executed successfully.")
cursorObj.close()
connection.close()
輸出
以下是上述程式碼的輸出:
INSERT IGNORE query executed successfully.