Мне сложно сформировать условный INSERT
У меня есть x_table со столбцами (экземпляр, пользователь, элемент), где идентификатор экземпляра уникален. Я хочу вставить новую строку только в том случае, если у пользователя уже нет данного элемента.
Например, при попытке вставить instance = 919191 user = 123 item = 456
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
Любая помощь или руководство в правильном направлении будут очень благодарны.
источник
dual
в этом случае создавать заранее или это какая-то специальная «временная» таблица, созданная запросом для использования только запроса?dual
, вам нужно создать его.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;
SELECT COUNT(*) FROM dual
всегда получаете1
, и еслиSELECT 'foo' FROM dual
вы всегда получаетеfoo
. Но вы не можетеSELECT * FROM dual
и не можетеDESCRIBE dual
или что-то в этом роде. Я не проверял, но я также не думаю, что вы также можете отозвать разрешенияdual
. Так что стоит отметить, что он работает так, как вы ожидаете ... кроме случаев, когда это не так;)Вы также можете использовать
INSERT IGNORE
который молча игнорирует вставку вместо обновления или вставки строки, когда у вас есть уникальный индекс для (пользователь, элемент).Запрос будет выглядеть так:
Вы можете добавить уникальный индекс с помощью
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.источник
Вы когда-нибудь пробовали что-то подобное?
источник
С помощью a
UNIQUE(user, item)
выполните:этот
user=123
бит - это «без операции», чтобы соответствовать синтаксисуON DUPLICATE
предложения, фактически ничего не делая при наличии дубликатов.источник
Если вы не хотите устанавливать уникальное ограничение, это работает как шарм:
Надеюсь, поможет !
источник
Вы хотите
INSERT INTO table (...) SELECT ... WHERE ...
. из руководства MySQL 5.6 .В вашем случае это:
Или, может быть, поскольку вы не используете какую-либо сложную логику для определения того, запускать
INSERT
или нет, вы можете просто установитьUNIQUE
ключ для комбинации этих двух столбцов, а затем использоватьINSERT IGNORE
.источник
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...
(работает 5.6.34)from dual
раньшеwhere
.FROM DUAL
это значение по умолчанию, если не было ссылок на таблицы ( см. эту документацию ).Если вы добавите ограничение, которое (x_table.user, x_table.item) является уникальным, то вставка другой строки с тем же пользователем и элементом не удастся.
например:
источник
Хотя перед вставкой данных хорошо проверять дублирование, я предлагаю вам установить уникальное ограничение / индекс для ваших столбцов, чтобы по ошибке нельзя было вставить повторяющиеся данные.
источник
Вы можете использовать следующее решение для решения вашей проблемы:
источник
Небольшое изменение ответа Алекса, вы также можете просто сослаться на существующее значение столбца:
источник
Итак, это означает PostgreSQL
источник
Синтаксис может отличаться в зависимости от вашей БД ...
источник