2017-02-21 6 views
0

Как задать значение столбца с помощью триггера? Я использую MySQL 5.5.54.Предустановленное значение столбца с помощью триггера

EDIT. Если я удалю ограничение NOT NULL на c2, это сработает.

mysql> USE mydb; 
Database changed 
mysql> INSERT INTO t(c1) VALUES(123); 
ERROR 1364 (HY000): Field 'c2' doesn't have a default value 
mysql> 

схема:

-- MySQL Script generated by MySQL Workbench 
-- 02/21/17 08:26:27 
-- Model: New Model Version: 1.0 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

-- ----------------------------------------------------- 
-- Schema mydb 
-- ----------------------------------------------------- 
DROP SCHEMA IF EXISTS `mydb` ; 
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `mydb` ; 

-- ----------------------------------------------------- 
-- Table `mydb`.`t` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`t` (
    `c1` INT NOT NULL AUTO_INCREMENT, 
    `c2` INT NOT NULL, 
    PRIMARY KEY (`c1`)) 
ENGINE = InnoDB; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 
USE `mydb`; 

DELIMITER $$ 
USE `mydb`$$ 
CREATE TRIGGER `t_BINS` BEFORE INSERT ON `t` FOR EACH ROW 
begin 
SET NEW.c2=321; 
end$$ 


DELIMITER ; 
+0

Возможно, вы могли бы присвоить значение по умолчанию при создании таблицы, поэтому 'INSERT' не подведет, а затем создать' 'TRIGGER' для AFTER INSERT ON' изменить' c2' значение? Просто идея. –

+0

@VicenteOlivertRiera Я ожидаю, что это сработает, но это фактически то же самое, что удаление ограничения NOT NULL. Спасибо – user1032531

+0

Я также думаю, что ошибка, которую вы опубликовали как ответ, поскольку я пытался воспроизвести проблему на моей коробке, и я не мог. Не могли бы вы попробуете одну вещь ради любопытства? Можете ли вы создать таблицу, определяющую значение по умолчанию для столбца c2? Например, 'create table t (c1 int primary key auto_increment, c2 int not null default 0) engine = innodb;' У вас все еще такая же ошибка при вставке новых строк? Если нет, задайте ли новые строки значение 0 в столбце 'c2' или значение, заданное триггером? Благодарю. –

ответ

0

Это, как представляется, ошибка MySQL, который был представлен 27 октября 2004 23:30 и не была решена. Ссылка https://dev.mysql.com/worklog/task/?id=6030. Я не могу найти никакой другой документации.

Два решения - удалить ограничение NOT NULL или оставить ограничение NOT NULL и предоставить значение по умолчанию.

This WorkLog originated from BUG#6295 (TRIGGERS ARE NOT PROCESSED FOR NOT NULL COLUMNS).

The problem is that if a column is declared as NOT NULL, it is not possible to do INSERT NULL (or UPDATE to NULL) even though there is associated trigger, setting NOT-NULL value.

For example:

  • Table 't1' with a NOT NULL column 'c1';

  • The table has BEFORE INSERT trigger which sets the 'c1' column to not null value (SET NEW.c1 = 1);

  • INSERT INTO t1 VALUES(NULL) or UPDATE t1 SET c1 = NULL fail with the following error: ERROR 1048 (23000): Column '' cannot be null

The cause for the current (wrong) behavior is that the column constraints are checked before triggers are executed.

This is against The Standard, which requires that column constraints are checked at the end of an SQL statement.

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