2011-01-29 3 views
1

В основном у меня есть куча представлений на основе простого столбца дискриминатора (например, CREATE VIEW tablename AS SELECT * FROM tablename WHERE discrcolumn = "значение дискриминатора").Значение по умолчанию MySQL на основе представления

При вставке новой строки в это представление он должен вставить «значение дискриминатора» в discrcolumn.

Я пробовал это, но, судя по всему, MySQL не понимает этого сам по себе, так как он выдает сообщение об ошибке «Поле таблицы вида вида не имеет значения по умолчанию». Конечно, столбец дискриминатора установлен NOT NULL.

Как исправить это? Возможно, триггер предварительной вставки?

UPDATE: Триггеры не будут работать на представлениях, см. Ниже комментарий.

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

EDIT:

Это, кажется, работает ...

Установка:

CREATE TRIGGER insert_[tablename] BEFORE INSERT ON [tablename] 
FOR EACH ROW SET NEW.[discrcolumn] = @variable 

Runtime:

SET @variable = [descrvalue]; 
INSERT INTO [viewname] ([columnlist]) VALUES ([values]); 
+0

Я попробовал курок, но он не работает. ' 'CREATE TRIGGER insert_account_ [discrval] ПЕРЕД ВСТАВИТЬ НА [ViewName] ДЛЯ КАЖДОЙ ROW SET NEW [discrname] =. '[Discrval]''' Общая ошибка: 1347 '[ViewName]' не является базовой таблицы» В документах также говорится: «Вы не можете связать триггер с таблицей или представлением TEMPORARY».: Http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html – Jake

ответ

0

Я не думаю, что вам нужно что-нибудь столь сложный как. Если вы создали вид такой, как

CREATE VIEW MYVIEW AS 
    SELECT COLUMN1, 
      COLUMN2, 
      DISCRIMINATOR_COLUMN 
     FROM MYTABLE 
     WHERE DISCRIMINATOR_COLUMN = 1; 

можно затем вставить в этой точке зрения, таким образом, ...

INSERT INTO MYVIEW (COLUMN1, 
        COLUMN2, 
        DISCRIMINATOR_COLUMN) 
    VALUES (1, 2, 3) 

и вид должен обновить правильно, если все столбцы в таблице, которые не присутствуют в представлении имеют соответствующие значения по умолчанию. Обратите внимание, что новое значение в DISCRIMINATOR_COLUMN не обязательно должно быть значением, выбранным в представлении, хотя, естественно, оно не будет отображаться в представлении, если оно выбрано, если оно не указано.

+0

Да, вы можете вручную вставить значение discirminator, но все дело не в этом. Дело в том, что обманывает приложение, думая, что он работает с выделенной базой данных, когда на самом деле он разделяет базу данных с другими экземплярами приложения. Возможно, мне следовало бы более четко сообщить эту цель. – Jake

+0

@ Джейк, возможно, я должен более внимательно изучить вопрос. Могу ли я предположить, что вы не выбираете столбец дискриминатора в своем представлении, чтобы предотвратить непреднамеренное подобное событие? –

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