2016-10-21 5 views
0

Я хочу вставить два значения (составные клавиши) только тогда, когда они еще не существуют, иначе 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; 

ответ

0

Использование select, не values:

INSERT INTO group_msg_response (license_id, grp_id) 
    SELECT license_id, grp_id 
    FROM (SELECT 1 as license_id, 1 as grp_id) x 
    WHERE NOT EXISTS (SELECT 1 
         FROM group_msg_response gmr 
         WHERE gmr.license_id = x.license_id AND 
          gmr.grp_id = x.grp_id 
        ); 

Или, еще лучше, пусть база данных сделать работая путем создания уникального индекса/ограничения:

create unique index unq_gmr_license_grp on group_msg_response(license_id, grp_id) ; 

Th ан вы можете сделать вставку как:

INSERT INTO group_msg_response (license_id, grp_id) 
    VALUES (1, 1) 
    ON DUPLICATE KEY UPDATE license_id = VALUE(license_id); 

Предложение ON DUPLICATE KEY не делает ничего - кроме предотвратить ошибку возникновения.

+0

Спасибо, но мне жаль, что есть более простой способ – user5858

+0

Я нахожу даже 'INSERT IGNORE INTO' от http://stackoverflow.com/a/1361368/543087, занимая наименьшее количество операций. Я иду с этим. – user5858

+0

@ пользователь5858. , , Я рекомендую вам использовать 'ON DUPLICATE KEY UPDATE'. 'INSERT IGNORE' может игнорировать другие ошибки, которые вы хотели бы поймать. –