MySQL значение по умолчанию на основе представления - PullRequest
1 голос
/ 29 января 2011

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

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

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

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

ОБНОВЛЕНИЕ: Триггеры не будут работать с представлениями, см. Комментарий ниже.

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

EDIT:

Это похоже на работу ...

Установка:

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

Продолжительность:

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

1 Ответ

0 голосов
/ 30 января 2011

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

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 не обязательно должно быть значением, выбранным в представлении, хотя, естественно, оно не будет отображаться в представлении при следующем выборе, если это не так.

...