2012-01-12 4 views
3

Я новичок в MySQL, я просто обнаружил, что он не поддерживает утверждения.Ограничение, связанное с MySQL

Я получил эту таблицу:

CREATE TABLE `guest` (
    `ssn` varchar(16) NOT NULL, 
    `name` varchar(200) NOT NULL, 
    `surname` varchar(200) NOT NULL, 
    `card_number` int(11) NOT NULL, 
    PRIMARY KEY (`ssn`), 
    KEY `card_number` (`card_number`), 
    CONSTRAINT `guest_ibfk_1` FOREIGN KEY (`card_number`) REFERENCES `member` (`card_number`) 
    ) 

Что мне нужно, что член может пригласить максимум 2 гостей. Итак, в таблице guest Мне нужно, чтобы конкретный card_number мог отображаться максимум 2 раза.

Как я могу управлять им без утверждений?

Спасибо.

+0

Нет текущий SQL продукта поддерживает 'CREATE ASSERTION' :( – onedaywhen

+1

Что о PostGreSQL – Dave

+0

Не последний раз, когда я смотрел? Подтвержденный в [7.3 docs] (http://www.postgresql.org/docs/7.3/static/sql-createtable.html) как не реализовано, но не упоминается ни в одном из способов в [9.1 docs] (http://www.postgresql.org /docs/9.1/static/sql-createtable.html)? – onedaywhen

ответ

3

Это определенно пахнет ДО ВСТАВКИ триггером на столе «гость»:

DELIMITER $$ 
DROP TRIGGER IF EXISTS check_guest_count $$ 
CREATE TRIGGER check_guest_count BEFORE INSERT ON `guest` 
    FOR EACH ROW BEGIN 
    DECLARE numguests int DEFAULT 0; 
    SELECT COUNT(*) INTO numguests FROM `guest` WHERE card_number=NEW.card_number; 
    if numguests>=2 THEN 
     SET NEW.card_number = NULL; 
    END IF; 
    END; 
$$ 
DELIMITER ; 

Это в основном смотрит на текущий счет гостя, и если он уже> = 2 устанавливает card_number в NULL. Поскольку card_number объявлен NOT NULL, это отклонит вставку.

протестирован и работает для меня на MySQL 5.1.41-3ubuntu12.10 (Ubuntu Lucid)

+0

Да ... но не создавал бы исключение, чтобы сказать, что у вас уже есть 2, лучше, чем терпеть неудачу, чтобы делать то, что пользователь спросил? – Ben

+0

Мы не терпим неудачу! Сам запрос на вставку терпит неудачу (с «card_number не может быть NULL»), который можно поймать на уровне кода el, из которого он выполняется против БД. –

+0

Хорошо, я вижу, это дает обратную связь. Как насчет того, кто жалуется на то, что не использует триггер, чтобы эмулировать ограничения из-за некислотного свойства mysql? – Dave

Смежные вопросы