2012-07-28 77 views
0

好之前觸發,所以我see,這種錯誤的做法:語法插入

mysql> 
mysql> show tables; 
+---------------------+ 
| Tables_in_nntp  | 
+---------------------+ 
| articles   | 
| newsgroups   | 
| newsgroups_articles | 
+---------------------+ 
3 rows in set (0.00 sec) 

mysql> describe newsgroups; 
+-----------+----------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+----------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| newsgroup | longtext | NO |  | NULL |    | 
+-----------+----------+------+-----+---------+----------------+ 
2 rows in set (0.00 sec) 

mysql> show create table newsgroups; 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table  | Create Table                                          | 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| newsgroups | CREATE TABLE `newsgroups` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `newsgroup` longtext NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 | 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> ALTER TABLE newsgroups ADD UNIQUE (newsgroup); 
ERROR 1170 (42000): BLOB/TEXT column 'newsgroup' used in key specification without a key length 
mysql> 

的已經應該用trigger填充?

好了,因爲我的根做了一個觸發像這樣:

mysql> 
mysql> show tables; 
+---------------------+ 
| Tables_in_nntp  | 
+---------------------+ 
| articles   | 
| newsgroups   | 
| newsgroups_articles | 
+---------------------+ 
3 rows in set (0.00 sec) 

mysql> 
mysql> delimiter | 
mysql> CREATE TRIGGER make_hash BEFORE INSERT ON newsgroups 
    -> FOR EACH ROW BEGIN 
    ->  INSERT INTO hash values ('0'); 
    -> END; 
    -> | 
Query OK, 0 rows affected (0.18 sec) 

mysql> 

然而,這只是虛擬數據。我怎麼能讓這個觸發器實際上創建哈希?

+0

「TRIGGER命令剝奪了用戶.. 。' - 你應該檢查你的用戶擁有什麼特權,並且如果有必要的話,用不同的用戶運行創建觸發器。 – Vatev 2012-07-28 23:41:48

+0

@Vatev我會以root身份嘗試,但我不認爲這是問題,用戶java有'USAGE'。 – Thufir 2012-07-28 23:55:50

回答

1

我認爲你應該保持原來的主鍵。
您可以添加一個哈希列

ALTER TABLE `newsgroups` ADD COLUMN `hash` CHAR(32) NOT NULL DEFAULT ''; 

,然後用

UPDATE newsgroups SET hash = MD5(newsgroup); 

填充它,然後刪除重複項,並添加你的唯一約束。

您還可以添加BEFORE INSERTBEFORE UPDATE觸發器設置hash

CREATE DEFINER=`root`@`localhost` 
TRIGGER `before_insert_newsgroups` 
BEFORE INSERT ON `newsgroups` 
FOR EACH ROW BEGIN 

    set new.hash = md5(new.newsgroup); 

END 

根據不同的SQL客戶端上使用的是你可能wan't到change the DELIMITER before and after the create trigger statement

+0

我正在查看[手冊](http://dev.mysql.com/doc/refman/5.0/zh-CN/create-trigger.html),並且您是否在給SQL改變表格?這些命令來自MySql控制檯? – Thufir 2012-07-28 23:22:10

+0

這並不是一個完整的陳述,我添加了缺失的部分。 – Vatev 2012-07-28 23:39:32

+0

ok創建了一個虛擬觸發器,但無法獲得上面描述的那種觸發器的語法。 – Thufir 2012-07-29 06:35:06