Я хочу вставить два значения (составные клавиши) только тогда, когда они еще не существуют, иначе Mysql даст ошибку о вводе повторяющихся ключей. ОшибкаГде не существует - ОШИБКА 1064 (42000): У вас есть ошибка в синтаксисе SQL; check
Мой этот запрос дает:
INSERT INTO group_msg_response (license_id,grp_id) VALUES (1,1) WHERE NOT EXISTS (SELECT 1 FROM group_msg_response WHERE license_id=1 AND grp_id=1)
Если я запускать их по отдельности они оба работают нормально.
Это дает эту ошибку:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT 1 FROM group_msg_response WHERE license_id=1 AND ' at line 1
Что может быть проблема? Я делаю так, как указано в https://dev.mysql.com/doc/refman/5.5/en/exists-and-not-exists-subqueries.html
Вот определение таблицы:
create table IF NOT EXISTS msg(
id INT UNSIGNED AUTO_INCREMENT ,
en varchar(5000),
hi varchar(5000),
PRIMARY KEY(id)
) ENGINE=InnoDB;
create table IF NOT EXISTS group_msg(
id INT UNSIGNED AUTO_INCREMENT ,
msg_id INT UNSIGNED,
lsource INT UNSIGNED NOT NULL,
browser CHAR(1) NOT NULL DEFAULT 'a' ,
expiry_date DATETIME NOT NULL ,
dated DATETIME NOT NULL,
deleteit TINYINT DEFAULT 0 ,
FOREIGN KEY (msg_id)
REFERENCES msg(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY(id)
) ENGINE=InnoDB;
create table IF NOT EXISTS group_msg_response(
license_id MEDIUMINT,
grp_id INT UNSIGNED,
FOREIGN KEY (grp_id)
REFERENCES group_msg(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY(license_id,grp_id)
) ENGINE=InnoDB;
Спасибо, но мне жаль, что есть более простой способ – user5858
Я нахожу даже 'INSERT IGNORE INTO' от http://stackoverflow.com/a/1361368/543087, занимая наименьшее количество операций. Я иду с этим. – user5858
@ пользователь5858. , , Я рекомендую вам использовать 'ON DUPLICATE KEY UPDATE'. 'INSERT IGNORE' может игнорировать другие ошибки, которые вы хотели бы поймать. –