MySQL - REPLACE 查询
MySQL REPLACE 语句
通常,如果我们想在现有表中添加记录,我们会使用 MySQL INSERT 语句。同样,我们也可以使用 MySQL REPLACE 语句添加新记录或替换现有记录。替换语句与插入语句类似。
唯一的区别是,使用插入语句插入记录时,如果现有列具有 UNIQUE 或 PRIMARY KEY 约束,则新记录与该列的值相同时,将生成错误。
对于 REPLACE 语句,如果您尝试插入一个新列,该列与具有 UNIQUE 或 PRIMARY KEY 约束的列的值重复,则旧记录将被新记录完全替换。
语法
以下是 MySQL REPLACE 语句的语法 -
REPLACE INTO table_name (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);
其中,table_name 是需要插入数据的表的名称,(column1, column2, column3,...columnN) 是列的名称,(value1, value2, value3,...valueN) 是记录中的值。
示例
首先在 MySQL 数据库中创建一个名为 CUSTOMERS 的表,并在 ID 列上设置主键约束,如下所示 -
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
以下查询将两条记录添加到上面创建的表中 -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ), (2, 'Khilan', 25, 'Delhi', 1500.00 );
执行以下查询以显示 CUSTOMERS 表中存在的所有记录 -
select * FROM CUSTOMERS;
以下是 CUSTOMERS 表中的记录 -
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
现在,我们尝试插入另一条 ID 值为 2 的记录 -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Kaushik', 23, 'Kota', 2000.00 );
由于 ID 列具有主键约束,因此将生成如下所示的错误 -
ERROR 1062 (23000): Duplicate entry '2' for key 'customers.PRIMARY'
现在,使用 REPLACE 语句替换表中的现有记录 -
REPLACE INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Kaushik', 20, 'Kota', 2000.00 );
输出
执行上述查询将产生以下输出 -
Query OK, 2 rows affected (0.01 sec)
验证
执行以下 SELECT 语句,验证新记录是否已被替换 -
select * from CUSTOMERS;
从下面的输出中我们可以看出,现有记录已被新记录替换 -
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Kaushik | 20 | Kota | 2000.00 |
使用 REPLACE 语句插入记录
使用 REPLACE 语句插入记录时,如果该记录与表中的任何现有记录都不匹配,则会将其添加为新记录。
示例
以下查询使用 REPLACE 语句向上述 CUSTOMERS 表中添加三条新记录 -
REPLACE INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Chaitali', 25, 'Mumbai', 6500.00 ), (4, 'Hardik', 27, 'Bhopal', 8500.00 ), (5, 'Komal', 22, 'Hyderabad', 4500.00 );
输出
执行上述查询将产生以下输出 -
Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0
验证
执行以下查询来验证上述记录是否已插入到 CUSTOMERS 表中 -
SELECT * FROM CUSTOMERS;
从下面的 CUSTOMERS 表中我们可以看出,上述记录已作为新记录插入到表中。
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Kaushik | 20 | Kota | 2000.00 |
3 | Chaitali | 25 | Mumbai | 6500.00 |
4 | Hardik | 27 | Bhopal | 8500.00 |
5 | Komal | 22 | Hyderabad | 4500.00 |
使用客户端程序替换记录
除了使用 MySQL 查询替换 MySQL 数据库中表的记录外,我们还可以使用客户端程序执行 REPLACE 操作。
语法
以下是在各种编程语言中使用 REPLACE 查询的语法 -
要通过 PHP 程序替换 MySQL 数据库中表中的记录,我们需要使用 mysqli 函数 query() 执行 Alter 语句,如下所示:-
$sql="REPLACE INTO TABLE_NAME SET COLUMN_NAME1 = NEW_VALUE, COLUMN_NAME2 = NEW_VALUE..."; $mysqli->query($sql);
要通过 Node.js 程序替换 MySQL 数据库中表中的记录,我们需要使用 mysql2 库中的 query() 函数执行 Alter 语句,如下所示:-
sql="REPLACE INTO table_name (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN)" con.query(sql);
要通过 Java 程序替换 MySQL 数据库中表中的记录,我们需要使用 JDBC 函数 executeUpdate() 执行 Alter 语句,如下所示:-
String sql="REPLACE INTO TABLE_NAME SET COLUMN_NAME1 = NEW_VALUE, COLUMN_NAME2 = NEW_VALUE..."; statement.executeUpdate(sql);
要通过 Java 程序替换 MySQL 数据库中表中的记录,我们需要使用 MySQL Connector/Python 的 execute() 函数执行 Alter 语句,如下所示:-
replace_query = "REPLACE INTO table_name (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN)" cursorObj.execute(replace_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 = "REPLACE INTO tutorials_tbl SET tutorial_id = 1, tutorial_title = 'Java Tutorial', tutorial_author = 'new_author'"; if($result = $mysqli->query($sql)){ printf("Replace statement executed successfully..! "); } $q = "SELECT * FROM tutorials_tbl"; if($res = $mysqli->query($q)){ printf("Records after replace statement are: "); while($row = mysqli_fetch_row($res)){ print_r ($row); } } if($mysqli->error){ printf("Failed..!" , $mysqli->error); } $mysqli->close();
输出
获得的输出如下 -
Replace statement executed successfully..! Records after replace statement are: Array ( [0] => 1 [1] => Java Tutorial [2] => new_author [3] => ) Array ( [0] => 2 [1] => PHP Tut [2] => unknown2 [3] => 2023-08-12 )
var mysql = require('mysql2'); var con = mysql.createConnection({ host: "localhost", user: "root", password: "Nr5a0204@123" }); //连接到 MySQL con.connect(function (err) { if (err) throw err; console.log("Connected!"); //选择数据库 sql = "USE TUTORIALS" con.query(sql); //Creating a table sql = "CREATE TABLE sales(ID INT UNIQUE, ProductName VARCHAR(255), CustomerName VARCHAR(255), DispatchDate date, DeliveryTime time, Price INT, Location VARCHAR(255));" con.query(sql); //将记录插入表中 sql = "INSERT into sales values(1, 'Mouse', 'Puja', DATE('2019-03-01'), TIME('10:59:59'), 3000, 'Vijayawada');" con.query(sql); //Displaying records before replacing sql = "Select * from sales" con.query(sql, function (err, result) { if (err) throw err; console.log(result); console.log("************************************************") }); //Replacing the record sql = "REPLACE into sales values(1, 'Mobile', 'Vanaja', DATE('2019-03-01'), TIME('10:10:52'), 9000, 'Chennai');" con.query(sql); //Displaying records after replacing sql = "Select * from sales" con.query(sql, function (err, result) { if (err) throw err; console.log(result); }); });
输出
生成的输出如下 -
Connected! [ { ID: 1, ProductName: 'Mouse', CustomerName: 'Puja', DispatchDate: 2019-02-28T18:30:00.000Z, DeliveryTime: '10:59:59', Price: 3000, Location: 'Vijayawada' } ] ************************************************ [ { ID: 1, ProductName: 'Mobile', CustomerName: 'Vanaja', DispatchDate: 2019-02-28T18:30:00.000Z, DeliveryTime: '10:10:52', Price: 9000, Location: 'Chennai' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class ReplaceQuery { public static void main(String[] args) { String url = "jdbc:mysql://localhost: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 = "REPLACE INTO tutorials_tbl SET tutorial_id = 1, tutorial_title = 'Java Tutorial', tutorial_author = 'John Smith'"; st.executeUpdate(sql); System.out.println("Replace query executed successfully..!"); String sql1 = "SELECT * FROM tutorials_tbl"; rs = st.executeQuery(sql1); System.out.println("Table records: "); while(rs.next()) { String tutorial_id = rs.getString("tutorial_id"); String tutorial_title = rs.getString("tutorial_title"); String tutorial_author = rs.getString("tutorial_author"); String submission_date = rs.getString("submission_date"); System.out.println("Id: " + tutorial_id + ", Title: " + tutorial_title + ", Author: " + tutorial_author + ", Submission_date: " + submission_date); } }catch(Exception e) { e.printStackTrace(); } } }
输出
获得的输出如下所示 -
Replace query executed successfully..! Table records: Id: 1, Title: Java Tutorial, Author: John Smith, Submission_date: null Id: 2, Title: Angular Java, Author: Abdul S, Submission_date: 2023-08-08 Id: 3, Title: Learning Java, Author: Sanjay, Submission_date: 2007-05-06 Id: 4, Title: Python Tutorial, Author: Sasha Lee, Submission_date: 2016-09-04 Id: 5, Title: Hadoop Tutorial, Author: Chris Welsh, Submission_date: 2023-08-08
import mysql.connector import datetime #建立连接 connection = mysql.connector.connect( host='localhost', user='root', password='password', database='tut') #创建游标对象 cursorObj = connection.cursor() replace_query = "REPLACE INTO tutorials_tbl (tutorial_id, tutorial_title, tutorial_author, submission_date) VALUES (3, 'Learning Java', 'John Doe', '2023-07-28')" cursorObj.execute(replace_query) connection.commit() print("REPLACE query executed successfully.") cursorObj.close() connection.close()
输出
以下是上述代码的输出 -
REPLACE query executed successfully.