Я пытаюсь выполнить следующий запрос:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
Но это возвращает ошибку. По сути, я не хочу вставлять запись, если поле «имя» записи уже существует в другой записи - как проверить, является ли новое имя уникальным?
Ответы:
На самом деле я не предлагаю вам это делать, так как
UNIQUE
индекс, предложенный Писквором и другими, - гораздо лучший способ сделать это, но вы можете фактически сделать то, что пытались:Вставить запись:
Попробуйте вставить ту же запись снова:
Вставьте другую запись:
И так далее...
Обновить:
Чтобы предотвратить
#1060 - Duplicate column name
ошибку, если два значения могут совпадать, вы должны назвать столбцы внутреннего SELECT:источник
name
в данном случае), если это вообще возможно. Обратите внимание, что вы можете сделатьSELECT 'John', 'Doe', '022' FROM table_listnames
вместоSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
- но это будет работать, только еслиtable_listnames
уже содержит одну или несколько строк. Я сомневаюсь, что скорость отличается, хотя, вероятно, это не проблема.WHERE
Заявление принадлежитSELECT
запросу. Запрос Select либо возвращает одну строку данных (данные вставлены), либо вообще не содержит данных (ничего не вставлено)SELECT 'Humbert', 'Humbert', '1'
во внутреннее выделение). Я получаюERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. Вы нашли решение? Изменить: нашел его. Добавьте за каждым значением AS:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT не позволяет
WHERE
в синтаксисе .Что вы можете сделать: создайте
UNIQUE INDEX
поле, которое должно быть уникальным (name
), затем используйте либо:INSERT
(и обработать ошибку, если имя уже существует)INSERT IGNORE
(который будетмолчавызывать ошибку (вместо ошибки), если имя уже существует)INSERT ... ON DUPLICATE KEY UPDATE
(который будет выполненUPDATE
в конце, если имя уже существует, см. документацию )источник
mysql> show warnings\G
INSERT IGNORE
, соответствует регулярному выражению^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO.Работал :
источник
MySQL предлагает очень симпатичное решение:
Очень прост в использовании, поскольку вы объявили уникальный первичный ключ (здесь со значением 5).
источник
Здесь запрос mysql, который вставляет записи, если они не существуют, и игнорирует существующие подобные записи.
источник
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
илиINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Вы можете легко использовать следующий способ:
Таким образом, вы можете вставить любое новое сырье и, если у вас есть дублирующиеся данные, заменить определенный столбец (лучший столбец - метки времени).
Например :
источник
Если вы действительно не можете получить уникальный индекс в таблице, вы можете попробовать ...
источник
Чтобы преодолеть подобную проблему, я изменил таблицу, чтобы иметь уникальный столбец. Используя ваш пример, при создании у меня было бы что-то вроде:
и затем используйте следующий запрос при вставке в него:
источник
Этот запрос работает хорошо:
И вы можете создать таблицу, используя следующий запрос:
Примечание. Создайте таблицу, используя второй запрос, прежде чем пытаться использовать первый запрос.
источник
Брайан Хупер: Вы почти достигли цели, но у вас есть ошибка в вашем синтаксисе. Ваша вставка никогда не будет работать. Я проверил на моей базе данных и вот правильный ответ:
Я даю вам мой пример таблицы. Вставка - почти то же самое, что написал Bian Hooper, за исключением того, что я поместил select FROM DUAL из другой таблицы. С наилучшими пожеланиями, Иван
источник
unknown table status: TABLE_TYPE
сообщения, хотя запрос дал результат. Возможно, потому что MySQL не требуетFROM DUAL
предложения?источник
Вы вставляете не обновляя результат. Вы можете определить имя столбца в первичном столбце или установить его уникальность.
источник
У меня возникла проблема, и метод, который Майк посоветовал, сработал частично, у меня была ошибка Dublicate Column name = '0', и я изменил синтаксис вашего запроса следующим образом`
Проблема была с именами столбцов. sum3 был равен sum4, а mysql выбрасывал дублирующие имена столбцов, и я написал код в этом синтаксисе, и он работал отлично,
источник
У меня была похожая проблема, и мне нужно было вставить несколько, если не существует. Итак, из приведенных выше примеров я пришел к этой комбинации ... она здесь на всякий случай, если кому-то понадобится.
Обратите внимание: мне приходилось определять имя везде, как того требовал MSSQL ... MySQL тоже работает с *.
MySQL: CREATE TABLE
names
(OID
int (11) NOT NULL AUTO_INCREMENT,name
varchar (32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (OID
), UNIQUE KEYname_UNIQUE
(name
)) ENGINE = InnoDB AUTO_INCREMENT = 1;или
MSSQL: СОЗДАТЬ ТАБЛИЦУ [names] ([OID] INT IDENTITY (1, 1) NOT NULL, [name] NVARCHAR (32) NOT NULL, первичный ключ кластеризован ([OID] ASC)); СОЗДАТЬ УНИКАЛЬНЫЙ НЕКЛАСТЕРНЫЙ ИНДЕКС [Index_Names_Name] ON [names] ([name] ASC);
источник
Этот запрос может быть использован в коде PHP.
У меня есть столбец идентификатора в этой таблице, поэтому мне нужно проверить наличие дубликатов для всех столбцов, кроме этого столбца идентификатора:
и теперь новый элемент будет добавлен только в том случае, если не существует строки со значениями, заданными в
SET
строкеисточник