Уникальное ограничение, как избежать дубликатов

Согласно моему предыдущему запросу , у меня есть таблица, которая выглядит так:

|| *nid* || *language* || || 8 || Chinese || || 8 || Portuguese || || 8 || German | 

В которых «нид» и «язык» имеют уникальное ограничение.

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

РЕДАКТИРОВАНИЕ

Я предполагаю, что я должен попытаться сделать такой запрос, как:

 SELECT * FROM lang WHERE nid = $nid AND language = $lang 

Если это возвращает FALSE, тогда я знаю, что теперь могу вставлять свои данные. Это верно ?

Обеспечьте уникальное ограничение, создав уникальный ключ:

 ALTER TABLE the_table ADD UNIQUE INDEX nid_language_unique (nid, language); 

Это ограничение запрещает две строки, имеющие одинаковый номер и язык.

Любой запрос, пытающийся нарушить ограничение, не удастся.

Поскольку вы хотите игнорировать ошибки (и все еще прерывать запрос), вы можете использовать INSERT IGNORE и UPDATE IGNORE :

 INSERT IGNORE INTO the_table (nid, language) VALUES (8, 'Chinese') /* row not inserted and no error */ 

Если вы действительно создали уникальное ограничение в базе данных, то MySQL не позволит вам вставить вторую строку. Заявление будет вызывать исключение. Вы можете ловушки и игнорировать это в своем коде. Если вас не интересует, добавлена ​​ли строка или нет, вы можете использовать IGNORE в команде MySQL INSERT INTO, и строка будет либо добавлена ​​(если не там), либо команда завершится без ошибки.

SELECT nid, язык FROM lang WHERE nid = $ nid AND language = $ lang

Если это возвращает FALSE, тогда я знаю, что теперь могу вставлять свои данные. Это верно ?

Да, но вам нужно написать:

 $nid = mysql_real_escape_string($_POST['nid']); $lang = mysql_real_escape_string($_POST['lang']); $query = SELECT nid, language FROM lang WHERE nid = '$nid' AND language = '$lang' // notice the quotes ^ ^ ^ ^ 

Если вы забудете, что ваш запрос даст ошибку (и будет угрожать SQL-инъекцией).

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

Вы можете использовать счетчик в своем коде (а не SQL, но тот, который вы используете для использования SQL, например PHP, или еще)

Вы можете использовать функцию MySQL max и добавить один (например, max (nid) +1 (но не помните о максимальной функции MySQL))

Вы можете использовать случайное число с 10 символами (так что у вас действительно был бы очень низкий риск попасть в сообщение об ошибке)

Я использовал первый и последний путь много раз.

И если вы хотите быть уверены, что у вас не будет дубликата, используйте решения из своих последних сообщений. Stuff, как ограничение UNIQUE, не позволит вам вставлять дважды один и тот же номер или язык (таким образом, если вы не справитесь с этим, ваша программа выйдет из строя).