2015-02-15 2 views
0

Есть ли способ проверить, существуют ли строки уже и являются ли они активными?Контроль ограничений MySQL, если они существуют и активны

Пусть говорят строки выглядят так:

ID: 123456 

Active : 1 

Я знаю, что я мог бы сделать что-то подобное:

SELECT * FROM TableName WHERE id=123456 AND Active=1; 

Но это не то, что я хочу.

И если я попытаюсь снова вставить запрос в таблицу с той же информацией, он не должен дублироваться.

Но ограничение должно работать, если оно не активно (0).

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

Спасибо!

+1

Я не совсем понимаю. Вы хотите, чтобы _permit_ 'INSERT', если' ID' дублируется и 'Active = 0', запрещая вставку, если' ID' дублируется и 'Active = 1'? В этом случае, если несколько строк были вставлены на ID с «Active = 0», а несколько «Active» были обновлены до «1» для одного «идентификатора», нарушило бы ограничение? –

+0

Я хочу убедиться, что идентификатор не активен, прежде чем вставлять его. Если идентификатор активен, вставка не должна работать. Но если идентификатор не активен (0), тогда вставка должна работать. –

+0

Но как насчет возможности вставки _many inactive rows_ для id? И не должны ли эти строки быть обновлены до активации позже? Другими словами, если бы многие были вставлены и 'UPDATE tbl SET active = 1 WHERE id = 123456 И active = 0' соответствовали 3 строкам, было бы ли это нарушением, чтобы обновить все 3 до' active = 1'? –

ответ

0

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

create trigger tr_bi_TableName 
before insert on TableName 
for each row 
begin 
    if((select count(*) from TableName where id = new.id and active = 1) > 0) then 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'There is already an active row for this id.'; 
    end if 
end 

SQLState 45000 означает необработанное пользовательское исключение.

Для получения дополнительной информации о сигнале см. documentaton.

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