gpt4 book ai didi

mysql - 触发器复制MySQL中的检查指令?

转载 作者:行者123 更新时间:2023-11-29 11:06:02 27 4
gpt4 key购买 nike

我正在通过 XAMPP、PHPMyAdmin 和 MariaDB 为一个大学项目开发​​数据库

据我所知,MySQL 不解析 CHECK 指令,我一直在尝试使用 TRIGGER 指令来复制该命令,但经过多次尝试搜索和尝试我没能成功。

CREATE TABLE 命令是这样的(抱歉有意大利语翻译)

CREATE TABLE Utente (
IdU int(10) AUTO_INCREMENT PRIMARY KEY,
Mail varchar(30) UNIQUE NOT NULL,
Nickname varchar(30) NOT NULL,
Password varchar(256) NOT NULL, /*Hashed Password*/
Nome varchar(30) DEFAULT NULL,
Cognome varchar(30) DEFAULT NULL,
DataNascita date DEFAULT NULL,
LuogoNascita varchar(30) DEFAULT NULL,
Sesso varchar(1) DEFAULT NULL,
Residenza varchar(30) DEFAULT NULL,
Categoria varchar(7) DEFAULT NULL
);

我想要复制的CHECK是这个

CHECK (Categoria = 'Amatore' OR Categoria = 'Esperto' OR Categoria = NULL)

这是我通过在线检查一些现有线程编写的TRIGGER

CREATE TRIGGER V1Insert BEFORE INSERT ON Utente
FOR EACH ROW
BEGIN
IF NOT(New.Categoria = 'Amatore' OR New.Categoria = 'Esperto' OR New.Categoria = NULL) THEN
SIGNAL SQLSTATE '10001'
SET MESSAGE_TEXT := 'Attenzione: la tupla inserita in Utente ha Categoria non valida';
END IF;
END;

理想情况下,我会为 UPDATE 命令执行另一个触发器

我不断收到错误#1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 6 行的 ':= 'Attenzione: la tupla inserita in Utente ha Categoria non valida'' 附近使用的正确语法

预先感谢您的帮助!

最佳答案

由于您已经在使用 MariaDB,并且您只是在开发您的项目,因此您可以尝试 10.2,其中已经实现了 CHECK 约束。它现在是测试版,但当您的项目完成时,它很可能会成为 GA。

MariaDB [test]> CREATE TABLE Utente (
-> IdU int(10) AUTO_INCREMENT PRIMARY KEY,
-> Mail varchar(30) UNIQUE NOT NULL,
-> Nickname varchar(30) NOT NULL,
-> Password varchar(256) NOT NULL, /*Hashed Password*/
-> Nome varchar(30) DEFAULT NULL,
-> Cognome varchar(30) DEFAULT NULL,
-> DataNascita date DEFAULT NULL,
-> LuogoNascita varchar(30) DEFAULT NULL,
-> Sesso varchar(1) DEFAULT NULL,
-> Residenza varchar(30) DEFAULT NULL,
-> Categoria varchar(7) DEFAULT NULL,
-> CHECK (Categoria = 'Amatore' OR Categoria = 'Esperto' OR Categoria IS NULL)
-> );
Query OK, 0 rows affected (0.55 sec)

MariaDB [test]> INSERT INTO Utente VALUES (NULL,'foo','foo','foo','foo','foo',NULL,'foo','A','foo','foo');
ERROR 4025 (23000): CONSTRAINT `CONSTRAINT_1` failed for `test`.`Utente`
MariaDB [test]> INSERT INTO Utente VALUES (NULL,'foo','foo','foo','foo','foo',NULL,'foo','A','foo','Amatore');
Query OK, 1 row affected (0.04 sec)

MariaDB [test]> INSERT INTO Utente VALUES (NULL,'bar','foo','foo','foo','foo',NULL,'foo','A','foo',NULL);
Query OK, 1 row affected (0.05 sec)

但是在您的情况下,仅使用 ENUM 来表示 Categoria 不是更容易吗?与严格模式一起使用,您将实现相同的目标,只是错误消息不同:

SET sql_mode='STRICT_ALL_TABLES';

MariaDB [test]> CREATE TABLE Utente2 (
-> IdU int(10) AUTO_INCREMENT PRIMARY KEY,
-> Mail varchar(30) UNIQUE NOT NULL,
-> Nickname varchar(30) NOT NULL,
-> Password varchar(256) NOT NULL, /*Hashed Password*/
-> Nome varchar(30) DEFAULT NULL,
-> Cognome varchar(30) DEFAULT NULL,
-> DataNascita date DEFAULT NULL,
-> LuogoNascita varchar(30) DEFAULT NULL,
-> Sesso varchar(1) DEFAULT NULL,
-> Residenza varchar(30) DEFAULT NULL,
-> Categoria enum ('Amatore','Esperto') NULL
-> );
Query OK, 0 rows affected (0.53 sec)

MariaDB [test]> INSERT INTO Utente2 VALUES (NULL,'foo','foo','foo','foo','foo',NULL,'foo','A','foo','foo');
ERROR 1265 (01000): Data truncated for column 'Categoria' at row 1
MariaDB [test]> INSERT INTO Utente2 VALUES (NULL,'foo','foo','foo','foo','foo',NULL,'foo','A','foo','Amatore');
Query OK, 1 row affected (0.05 sec)

MariaDB [test]> INSERT INTO Utente2 VALUES (NULL,'bar','foo','foo','foo','foo',NULL,'foo','A','foo',NULL);
Query OK, 1 row affected (0.04 sec)

关于mysql - 触发器复制MySQL中的检查指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41396829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com