2013-07-21 2 views
0

Я пытаюсь вставить строку в таблицу, но только если комбинация из X и Y уже не существует в таблице, поэтому я искал ее и, в конце концов, запрос, но он ничего не делает и не вызывает ошибок.MySQL INSERT с оператором SELECT Doing Nothing

INSERT INTO `tiles` (`TileID`, `Type`, `X`, `Y`) 
SELECT UUID(), (FLOOR(RAND() * 4)), 0, 0 FROM `tiles` 
WHERE NOT EXISTS (SELECT 1 FROM `tiles` WHERE `X`=0 AND `Y`=0) LIMIT 1; 

Любая помощь очень ценится.

+0

Возможный дубликат HTTP: // StackOverflow .com/вопросы/3164505/mysql-insert-record-if-not-exists-in-table – Kyle

+0

ang Как вы 'внешний выбор' * подключен * с блоком 'select' on' exist'? –

ответ

1

Возможным решением может быть добавить UNIQUE ограничение на (x, y)

ALTER TABLE tiles ADD UNIQUE (x, y); 

и использовать INSERT IGNORE

INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0); 
INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0); 

Вот SQLFiddle демо

+0

Этот ответ обеспечит будущие дублирующие проблемы, спасибо –

1

По существу, все, что вам нужно сделать, сворачивает ваш выбор с помощью select * from(). Это делает запрос:

INSERT INTO `tiles` (`TileID`, `Type`, `X`, `Y`) 
SELECT * FROM (SELECT UUID(), (FLOOR(RAND() * 4)), 0 as x, 0 as y) as tmp 
WHERE NOT EXISTS (SELECT 1 FROM `tiles` WHERE `X`=0 AND `Y`=0) LIMIT 1; 

мне пришлось добавить «как х» и «как у», потому что MySQL жалуется на «дубликат имя столбца„0“». Я предполагаю, что без имени, явно выписанного, оно просто использует значение как имя. В любом случае, этот запрос должен работать. Кроме того, есть больше информации об этом типе вещей в ссылке Кайла выше.