Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql REPLACE truy vấn với nhiều khóa chính

Nó không tạo ra sự khác biệt, đó là cùng một cú pháp. Chỉ cần đảm bảo rằng bạn có cả hai khóa được chỉ định dưới dạng cột. Ví dụ:

REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );

CHỈNH SỬA

Đây là thử nghiệm của tôi, tôi đã chạy trong cơ sở dữ liệu thử nghiệm của mình để đảm bảo rằng tôi không phá hủy dữ liệu của bạn. Tất nhiên, tôi khuyến khích bạn nên dùng thử nếu bạn không chắc chắn!

CREATE SCHEMA `my_testdb`;
USE `my_testdb`;
CREATE TABLE `my_table` (
  `key1` VARCHAR(20) NOT NULL,
  `key2` INTEGER NOT NULL,
  `othercolumn1` VARCHAR(50),
  CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'Green widget with fuchsia trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 15, 'Yellow widget with orange trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'thingamabobs', 14, 'Red widget with brown trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
SELECT * FROM `my_table`;

Đây là kết quả của tôi:

key1          key2  othercolumn1
widgets       14    Blue widget with purple trim
widgets       15    Yellow widget with orange trim
thingamabobs  14    Red widget with brown trim

CHỈNH SỬA KHÁC

Tôi nghĩ rằng tôi thấy những gì bạn đang nói trong tài liệu, sự nhầm lẫn giữa các cột duy nhất:

Điều đó đề cập đến một trường hợp khá phức tạp trong đó hàng bạn đang thay thế có xung đột không chỉ với khóa chính hiện có mà còn với các cột duy nhất khác. Đây là một ví dụ khác để minh họa điểm này:

CREATE SCHEMA `my_testdb2`;
USE `my_testdb2`;
CREATE TABLE `my_table` (
  `key1` VARCHAR(20) NOT NULL,
  `key2` INTEGER NOT NULL,
  `color` VARCHAR(20) NOT NULL UNIQUE,
  `othercolumn1` VARCHAR(50),
  CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'green', 'Green widget with fuchsia trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 15, 'yellow', 'Yellow widget with orange trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'thingamabobs', 14, 'red', 'Red widget with brown trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'yellow', 'Yellow widget with purple trim' );
SELECT * FROM `my_table`;

Lưu ý rằng thao tác REPLACE cuối cùng không chỉ xung đột với (key1 , key2 ) khóa chính, của REPLACE đầu tiên, nhưng cũng có màu duy nhất của khóa thứ hai. Trong trường hợp này, CẢ HAI hàng sẽ bị xóa trước khi thao tác REPLACE cuối cùng được thực hiện để kết quả không có xung đột. Bạn sẽ chỉ có hai hàng:

key1          key2  color   othercolumn1
widgets       14    yellow  Yellow widget with purple trim
thingamabobs  14    red     Red widget with brown trim

Cả hàng có (key1 , key2 ) bằng ('widget', 14) hàng có màu 'vàng' đã bị thổi bay do hàng mới xung đột với nhiều ràng buộc duy nhất trên bảng.

Hy vọng điều này sẽ hữu ích!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHỌN nhiều hàng MÀ phù hợp với hai điều kiện

  2. SQL:Chọn bản ghi cuối cùng cho mỗi ngày giờ đã cho

  3. MySQL:Tham gia bên trong so với Ở đâu

  4. chèn và cập nhật với thủ tục được lưu trữ

  5. Làm thế nào để viết truy vấn bên trong trả về thông báo mới nhất cho một người dùng nhất định?