2014-03-12 38 views
0

我在MySQL Workbench 5.6中執行以下SQL代碼時遇到問題。該表是有序創建的,觸發器創建代碼也可以正常運行。但是,當我嘗試運行這兩個插入到語句中時,我有一個錯誤錯誤代碼:1054.未知列'通過'在'字段列表'中。如果我運行最後的選擇語句,它也按預期運行!?在插入觸發器阻止執行以下INSERT INTO語句之前

我真的無法想象運行觸發器創建腳本後發生了什麼!

如果我在插入語句之前不運行triger創建代碼,它們按預期執行,並且數據插入到列中。

/*任務15:編寫一條SQL語句來創建一個表用戶。用戶應具有用戶名,密碼,全名和上次登錄時間。爲表格字段選擇適當的數據類型。 使用主鍵約束定義主鍵列。將主鍵列 定義爲標識以便於插入記錄。定義唯一約束以避免重複使用 用戶名。定義檢查約束以確保密碼長度至少爲5個字符。 */

create table Users(
    UserID int auto_increment not null, 
    Username nvarchar(50) not null, 
    Pass varchar(100) not null, 
    FullName nvarchar(100), 
    LastLoginTime datetime, 
    constraint PK_Users primary key(UserID), 
    constraint UK_Users_Username UNIQUE(Username), 
    constraint CH_Users_Password CHECK(length(users.Pass)>=5) 
    ); 

DELIMITER $$ 
CREATE TRIGGER `TR_BeforeInsert_Users` 
BEFORE INSERT ON `users` 
FOR EACH ROW 
BEGIN 
    IF LENGTH(`Pass`) < 5 THEN 
    SIGNAL SQLSTATE '12345' 
     SET MESSAGE_TEXT = 'check constraint on Pass failed'; 
    END IF; 
END$$ 
delimiter ; 

Insert into Users(Username, Pass, FullName,lastlogintime) values('ttitto','alabala','Todor', now()); 
Insert into Users(Username, Pass, FullName,lastlogintime) values('ttitt','ala','Todor', now()); 
select length(Pass) from users; 

回答

1

在觸發器,一個必須引用列與任一NEWOLD僞表前綴。在你的情況:

DELIMITER $$ 
CREATE TRIGGER `TR_BeforeInsert_Users` 
BEFORE INSERT ON `users` 
FOR EACH ROW 
BEGIN 
    IF CHAR_LENGTH(NEW.Pass) < 5 THEN 
    SIGNAL SQLSTATE '12345' 
     SET MESSAGE_TEXT = 'check constraint on Pass failed'; 
    END IF; 
END$$ 
delimiter ; 
+0

它的工作和解決了我的問題。感謝您在這4小時內幫助我解決問題! – ttitto

+0

@ttitto:另請注意,該任務要求您檢查密碼長度超過5 *個字符*,這需要使用MySQL的['CHAR_LENGTH()'](http://dev.mysql.com/ doc/en/string-functions.html#function_char-length)函數。 ['LENGTH()'](http://dev.mysql.com/doc/en/string-functions.html#function_length),你正在使用,返回*字節數*可能小於如果列使用多字節字符集進行編碼,則爲字符數。 – eggyal

+0

我也不知道。再次感謝! – ttitto

相關問題