Perl MySQL - как пропустить обновление или вставку строки, если определенное поле соответствует? - PullRequest
2 голосов
/ 22 октября 2010

Я довольно новичок в этом, извините за недостаток знаний.

Я создал несколько таблиц, в которые я успешно записал и получил доступ через скрипт Perl, используя модули CGI и DBI благодаря советамздесь.

Это список участников для рассылки новостей местной группы.Да, я знаю, есть множество приложений, но я хочу изучить это.

1- Я хотел бы избежать обновления или вставки строки, если часть моего ввода соответствует данным столбца в одном конкретном столбце / поле.

При создании таблицы в phpmyadmin я щелкнул «U» (уникальный) для имени этого столбца в представлении структуры.Казалось бы, это работает, и никакие дуплексы не вставляются, но я желаю иметь жестко запрограммированное решение Perl, поэтому я понимаю механизм этого.

Я прочитал «вставить игнорировать» / «обновить игнорировать» и искал всено все, что я обнаружил, похоже, не пропустит обман.

Столбец не является ключом или автоматическим вводом, а представляет собой просто старое поле с адресом электронной почты.(ошибка?)

2- Когда я пишу в базу данных, я хочу сделать НИЧЕГО, если адрес входящей электронной почты совпадает с адресом в этом поле.

Я хочу самый быстрый способ, чтобы я мог зациклитьчерез свои существующие списки экспортируйте данные (они не могут выяснить программное обеспечение) без проблем гонок / блокировок или любых других условий, в которых я нахожусь в явном невежестве.

Поскольку я создаю это с нуля, 1 и 2 могутбыть фактически частично спорным.Если да, то какой подход был бы наилучшим?

Мне все еще нужен идентификатор с автоматическим приращением, поэтому я могу получить доступ с помощью номера идентификатора или выполнить цикл с помощью какого-либо счетчика ++ foreach.

MyПодход каменного ножа здесь может показаться смешным гуру, но мне нужно с чего-то начать.

Заранее спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Если в столбце адреса электронной почты объявлен UNIQUE, INSERT IGNORE - это именно то, что вы хотите вставить.Похоже, вы уже знаете, как поступить правильно!

(Вы можете выполнить функцию «не вставлять, если она уже существует» в Perl, но это трудно сделать правильно, потому что вы должны обернутьтестирование и обновление в транзакции. Одним из больших преимуществ реляционной базы данных является то, что она будет выполнять такие проверки для вас, обеспечивая целостность данных, даже если ваше приложение содержит ошибки.)

Для обновления яЯ не уверен, как будет выглядеть "игнорирование обновлений".Что содержится в предложении WHERE, которое ограничивает ОБНОВЛЕНИЕ только для 1 желаемой строки?Возможно, тот первичный ключ auto_increment, который вы упомянули?Если вы хотите написать, например,

UPDATE members SET firstname='Sue' WHERE member_id = 5;

, то я думаю, что эта функциональность "игнорирования обновления", которую вы хотите, может быть просто что-то вроде

UPDATE members SET firstname='Sue' WHERE member_id = 5
    AND email != 'sue@example.com';

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

1 голос
/ 22 октября 2010

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

...