Вопрос по sql, mysql – MySQL INSERT, если не существует (не используя первичный ключ)

9

как я могу вставить в строку, еслиpair не существует?
* Обратите внимание, что это не первичные ключи, мой основной ключ установлен на автоинкремент

пробовал вставить игнорировать но не получилось

INSERT IGNORE INTO mytable (`myid`, `theirid`) VALUES ('5', '1')
ON DUPLICATE KEY <DO NOTHING>

Стол выглядит так:

CREATE TABLE `mytable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `myid` bigint(20) NOT NULL,
    `theirid` bigint(20) NOT NULL,
    `activated` tinyint(1) NOT NULL DEFAULT '0',
    `dateStamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1$$
вопрос в том, если строка уже существует, что вы хотите сделать? jcho360
@JohnP не уверен, что вы имеете в виду, но просто напоминание, что эти 2 столбцаmyid, theirid не первичные ключи t q
Вот почему я сказал, посмотри на это еще раз. on duplicate key используется при дублировании первичного ключа или индексированного поля, а не при дублировании пары случайных столбцов. Это в значительной степени не имеет отношения к тому, как вы это делаете сейчас. JohnP
@ jcho360 да, & lt; НЕ НИЧЕГО & gt; нужно заменить на команду ничего не делать t q
Я думаю, вам нужно посмотреть, что связывает ON DUPLICATE KEY для столбцов. Как и INSERT IGNORE, я не думаю, что он делает то, что вы думаете, он делает. JohnP

Ваш Ответ

4   ответа
1

Дублирующее исключение (1062) вызывается только для ключей, если его индексировать как уникальное, что оно вызывает, освобождает ведьму "ON DUPLICATE KEY". (т.е. 1062)

что вы можете сделать, это добавить составной ключ UNIQUE (myid,theirid), если вы хотите вызвать исключение, когда оба они вместе, или просто добавить их как отдельные, если вы хотите или

но я не уверен в синтаксисе, так что просто посмотрите, но это будет выглядеть так ...

CREATE TABLE `mytable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `myid` bigint(20) NOT NULL,
    `theirid` bigint(20) NOT NULL,
    `activated` tinyint(1) NOT NULL DEFAULT '0',
    `dateStamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),  UNIQUE(`a`,`b`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1$$

INSERT myid, theirid VALUES ('4' , '1') into mytable 
ON DUPLICATE KEY 
UPDATE `myid`,`theirid` ; 
1

Я думаю, что вы не ясно, на дубликате делает .... Идея использовать его: если поле дублирует его, замените старое на новое или просто измените первичный ключ, чтобы сделать его УНИКАЛЬНЫМ ... Вы не можете сделать,on duplicate do nothing потому что по умолчанию он ничего не будет делать, он не будет вставлен. Посмотрите здесь

mysql> insert into t2 values (20000,'a','a',0);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values (20000,'a','a',0);
ERROR 1062 (23000): Duplicate entry '20000' for key 'PRIMARY'

так что ничего не вышло. Если вы хотите знать, существует ли значение, вам следует использовать оператор Select перед вставкой.

Дело в том, что дубликат ключа предназначен для работы, если вы обновляете первичный ключ. Поскольку это не так, нет необходимости указывать его в своем запросе, поэтому я сказал, что это не имеет отношения к тому, что вы делаете.
мой первичный ключ установлен на автоинкремент, я не буду обновлять его так t q
0

В зависимости от того, как часто вы выполняете этот запрос (и некоторые другие элементы среды), но я бы сказал, что имеет смысл создать уникальный индекс для этих полей. Таким образом, если они являются дубликатами, mysql просто вернет дубликат кода ошибки и не добавит его в таблицу. Кроме того, это заставит этот запрос выполнять LOT быстрее, учитывая, что ему не нужно проверять всю базу данных, если введенные значения являются дубликатами.

будет ли это работать, если бы я имел повторяющиеся значения, такие как (5,1) (5,2) (5,3) t q
@tq: я прошу прощения за мой поздний ответ. Некоторые сценарии не загружались, поэтому сайт некоторое время не работал для меня. Я предположил, что у вас есть таблица соединений с PK, myid и yourid. Если вы добавите уникальный кластеризованный индекс в myid, вы должны предотвратить двойные вставки.
ВЫБЕРИТЕ COUNT (*) как итоговое значение от your_table WHERE, столбец 1 = "5". и column2 = "1"; Тогда, если total = 0, вставьте, иначе ничего не делайте. Я думаю, вы могли бы объединить все это в одном запросе, но в этом синтаксисе я не уверен.
у меня естьid столбец, который автоматически учитывается как первичный ключ. если так, то как будет выглядеть команда SQL? t q
@tq: если вы индексируете его как кластер, значения типа (5,1), (5,2) не будут вызывать повторяющуюся ошибку. Если вы создадите свой уникальный индекс неправильно, то он выдаст эту ошибку раньше. Легко проверить, правильно ли вы строите свой индекс, поскольку он, вероятно, даже не позволит вам построить индекс, если вы сделаете это неправильно.
12

UNIQUE ограничение на(myid, theirid)? Если да, добавьте это ограничение и используйте:

INSERT INTO mytable (myid, theirid) 
  VALUES (5, 1) ;

и игнорировать предупреждения о продукции (или заменить вышеприведенноеINSERT IGNORE)

2) Если вы не можете добавить такое ограничение (например, иногда вы хотите разрешить такие дубликаты, а иногда нет), вы можете использовать это:

INSERT INTO mytable (myid, theirid) 
  SELECT 5, 1 
  FROM dual 
  WHERE NOT EXISTS
        ( SELECT *
          FROM mytable
          WHERE myid = 5
            AND theirid = 1
        ) ; 
Какие столбцы у таблицы? Пожалуйста, добавьтеSHOW CREATE TABLE mytable вывод в вашем вопросе.
Мой плохой, редактирование. (удаление парентеза)
не получаю ошибку, у меня это в php ini_set («display_errors», 1); error_reporting (E_ALL | E_STRICT); t q
да, вот что я имел ввиду под новыми записями, не вставляю t q
Вы пробовали второй запрос (и вы поместили два значения (5 и 2) в обоих местах?

Похожие вопросы