2016-10-06 4 views
0

Я хотел бы добавить строки в мою таблицу отношений, где будут обновлены старые строки и добавлены новые строки. Вот мой запрос (ID является единственным ключом):Как сделать INSERT ... ON DUPLUCATE KEY UPDATE со старыми и новыми строками?

INSERT INTO table_rel (ID, player, team, status) VALUES (1,1,1,0), (2,3,1,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

Что я поставил вместо ID в строках, которые должны быть созданы? например. (false,2,1,1)

+1

для auto_incs просто не имеют заполнителей. skip em – Drew

+0

... или укажите значение NULL, либо используя ключевое слово NULL, либо выражение, которое оценивает значение NULL. См. Мой ответ для демонстрации. – spencer7593

ответ

1

Если это для столбца AUTO_INCREMENT, вы можете указать значение NULL. Самый простой способ сделать это ключевое слово NULL

INSERT INTO table_rel (ID, player, team, status) VALUES 
    (1,1,1,0) 
,(2,3,1,1) 
,(NULL,6,1,0) 
    ^^^^ 

Там много других выражений, которые вы можете использовать, чтобы вернуть значение NULL.


Демонстрация подача NULL ключевого слова столбец AUTO_INCREMENT, наряду с другими строками, которые имеют ненулевое значение, поставляемое:

CREATE TABLE foo 
(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 
, mi VARCHAR(5) 
) ENGINE=INNODB; 
; 

INSERT INTO foo (id, mi) VALUES 
(1,'1') 
,(NULL,'too') 
; 
-- 2 row(s) affected 

INSERT INTO foo (id, mi) VALUES 
(1,'one') 
,(NULL,'three') 
,(2,'two') 
ON DUPLICATE KEY 
UPDATE mi = VALUES(mi) 
; 
-- 5 row(s) affected 

SELECT * FROM foo 
; 
-- id mi 
-- --- ------ 
-- 1 one 
-- 2 two 
-- 3 three 
1

У вас нет. С:

INSERT INTO table_rel (ID, player, team, status) ... 

Вы обязуетесь предоставить ВСЕ перечисленные значения. Затем с

... VALUES (1,1,1,0), (2,3,1,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

вы предоставляете фактические значения, ID включены (даже для новых записей). В этом случае, если нет ID=1 или ID=2, запись будет создана, в противном случае для дубликатов ключей value будет перезаписана.

Другим решением, если вы не хотите, чтобы указать ключ для новых записей, то вы должны использовать другое заявление (обратите внимание на отсутствующий столбец):

INSERT INTO table_rel (player, team, status) VALUES (1,1,0), (3,1,1) 

при условии, что table_rel имеет AUTO_INCREMENT опцию ID (на всякий случай: ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT;).

UPDATE: Опираясь на AUTO_INCREMENT вы можете предоставить NULL ключ и дайте двигателю создать новый ключ для вас. См. spencer7593's answer для более полного описания.

+0

Так что я вообще опускаю ID? как в '(, 1,1,0)' или я предоставляю значения с одним столбцом, отсутствующим '(1,1,0)', и SQL будет знать, что это идентификатор? В таблице есть автоинкремент, и я хотел поразить 2 птиц одним камнем –

+0

, как указано в @ spencer7593, вы должны использовать '(NULL, 1, 1,0)', в противном случае использовать второй оператор с '(1,1,0) '. '(, 1,1,0)' не является допустимым синтаксисом. – Batsu

 Смежные вопросы

  • Нет связанных вопросов^_^