Не би трябвало да има разлика, синтаксисът е същият. Просто се уверете, че имате и двата ключа, посочени като колони. Например:
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
РЕДАКТИРАНЕ
Ето моя тест, който проведох в моята тестова база данни, за да се уверя, че нямам намерение да унищожа вашите данни. Разбира се, препоръчвам ви да го изпробвате, ако не сте сигурни!
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`;
Това е моят резултат:
key1 key2 othercolumn1
widgets 14 Blue widget with purple trim
widgets 15 Yellow widget with orange trim
thingamabobs 14 Red widget with brown trim
ДРУГА РЕДАКТИРАНЕ
Мисля, че виждам за какво говорите в документацията, объркването около уникалните колони:
Това се отнася до доста измислено обстоятелство, при което редът, който заменяте с конфликти не само със съществуващ първичен ключ, но и с други уникални колони. Ето още един пример, който да илюстрира тази точка:
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`;
Забележете как последната операция REPLACE не само е в конфликт с (key1
, key2
) първичен ключ, на първия REPLACE, но също и с уникалния цвят на втория. В този случай И ДВАТА реда се изтриват преди последната операция REPLACE да бъде извършена, така че резултатът да няма конфликт. В крайна сметка ще получите само два реда:
key1 key2 color othercolumn1
widgets 14 yellow Yellow widget with purple trim
thingamabobs 14 red Red widget with brown trim
И двата реда с (key1
, key2
) равно на ('widgets', 14) AND редът с цвят „жълто“ беше издухан поради конфликта на новия ред с множество уникални ограничения на таблицата.
Надявам се това да помогне!