Согласно моему предыдущему запросу , у меня есть таблица, которая выглядит так:
|| *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, не позволит вам вставлять дважды один и тот же номер или язык (таким образом, если вы не справитесь с этим, ваша программа выйдет из строя).