2017-02-21 3 views
0

Wie kann ich den Wert einer Spalte mit einem Trigger voreinstellen? Ich benutze MySQL 5.5.54.Voreingestellter Spaltenwert mit einem Trigger

BEARBEITEN. Wenn ich die NOT NULL-Einschränkung für c2 entferne, scheint es zu funktionieren.

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

Schema:

-- 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

Vielleicht könnten Sie einen Standardwert zuweisen, wenn Sie die Tabelle erstellen, so dass die 'INSERT' wird nicht scheitern, und erstellen Sie dann die' TRIGGER' für 'AFTER INSERT ON' den' c2' Wert zu ändern? Nur eine Idee. –

+0

@ VicenteOlivertRiera Ich erwarte, dass das funktionieren würde, aber es ist im Grunde dasselbe wie das Entfernen der NOT NULL-Bedingung. Danke – user1032531

+0

Ich denke auch, dass dieser Bug du als Antwort gepostet hast, als ich versuchte, das Problem auf meiner Box zu reproduzieren und ich konnte es nicht. Könnten Sie bitte etwas aus Neugierde versuchen? Können Sie die Tabelle erstellen, die einen Standardwert für die Spalte c2 definiert? Zum Beispiel: create table t (c1 int Primärschlüssel auto_increment, c2 int not null default 0) engine = innodb; 'Haben Sie immer noch denselben Fehler beim Einfügen neuer Zeilen? Wenn nicht, haben die neuen Zeilen den Wert 0 in der Spalte "c2" oder den vom Trigger gesetzten Wert? Vielen Dank. –

Antwort

0

Dies scheint ein MySQL Fehler zu sein, die am 27. Oktober 2004 23.30 Uhr eingereicht wurden und nicht behoben wird. Referenz https://dev.mysql.com/worklog/task/?id=6030. Ich kann keine andere Dokumentation finden.

Zwei Lösung sind die NOT NULL Einschränkung zu entfernen, oder halten Sie die NOT NULL Einschränkung und einen Standardwert zur Verfügung stellen.

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.

Verwandte Themen