我有两张表A和B,当表A中增加一条记录时需要在表B中增加一列(是一列,不是一行,也就是改变表的结构)。
这中情况应该怎么办呢?
把Alter语句放到哪儿呢?
我以前一直都是用trigger,但是trigger中好像不允许使用(报错:Explicit or implicit commit is not allowed in stored function or trigger.)。
Connection id: 54
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.22-community-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 3 hours 23 min 37 sec
2.当我把Alter放到trigger中的时候,就会报错(我上面写的那个)。
(报错:Explicit or implicit commit is not allowed in stored function or trigger.)。
3.文件内容如下:
CREATE TRIGGER `CHRM_PAYROLL_ITEM_AFTER_INS_TR` AFTER INSERT ON `chrm_payroll_item`
FOR EACH ROW
BEGIN
UPDATE CHRM_PAYROLL_TYPE SET CHRM_PAYROLL_TYPE.NEED_RECALCULATION = 'Yes'
WHERE (CHRM_PAYROLL_TYPE.OID = NEW.OID);
IF NEW.ITEM_DATA_SOURCE = PEOPLE_FIXED_VALUE THEN
UPDATE CHRM_PAYROLL_C_FIXED_DATA SET CHRM_PAYROLL_C_FIXED_DATA.COLUMN_1=1;
alter table CHRM_PAYROLL_C_FIXED_DATA drop column COLUMN_2;
END IF;
END;
4.但是好像也有限制:
但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。
ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE
DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL
LOCK OPTIMIZE REPAIR REPLACE REVOKE
ROLLBACK SAVEPOINT 'SELECT FROM table'
'SET system variable' 'SET TRANSACTION'
SHOW 'START TRANSACTION' TRUNCATE UPDATE
yejr
周三, 2007/01/10 - 10:36
Permalink
用mysql.5.x版本的就支
用mysql.5.x版本的就支持触发器了。
MySQL中文网: http://imysql.cn
Google MySQL中文用户群:http://groups.google.com/group/imysql
给你的祝福,要让你招架不住!
sxryan
周三, 2007/01/10 - 12:20
Permalink
1.我的已经是mysql.5.x版
1.我的已经是mysql.5.x版本。
这是显示的版本信息:
mysql Ver 14.12 Distrib 5.0.22, for Win32 (ia32)
Connection id: 54
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.22-community-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 3 hours 23 min 37 sec
2.当我把Alter放到trigger中的时候,就会报错(我上面写的那个)。
(报错:Explicit or implicit commit is not allowed in stored function or trigger.)。
3.文件内容如下:
CREATE TRIGGER `CHRM_PAYROLL_ITEM_AFTER_INS_TR` AFTER INSERT ON `chrm_payroll_item`
FOR EACH ROW
BEGIN
UPDATE CHRM_PAYROLL_TYPE SET CHRM_PAYROLL_TYPE.NEED_RECALCULATION = 'Yes'
WHERE (CHRM_PAYROLL_TYPE.OID = NEW.OID);
IF NEW.ITEM_DATA_SOURCE = PEOPLE_FIXED_VALUE THEN
UPDATE CHRM_PAYROLL_C_FIXED_DATA SET CHRM_PAYROLL_C_FIXED_DATA.COLUMN_1=1;
alter table CHRM_PAYROLL_C_FIXED_DATA drop column COLUMN_2;
END IF;
END;
4.但是好像也有限制:
但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。
ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE
DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL
LOCK OPTIMIZE REPAIR REPLACE REVOKE
ROLLBACK SAVEPOINT 'SELECT FROM table'
'SET system variable' 'SET TRANSACTION'
SHOW 'START TRANSACTION' TRUNCATE UPDATE
在触发器中也有完全一样的限制.
yejr
周三, 2007/01/10 - 13:31
Permalink
我试验过了,也不行
我试验过了,也不行,看来只能在程序中实现了。
MySQL中文网: http://imysql.cn
Google MySQL中文用户群:http://groups.google.com/group/imysql
给你的祝福,要让你招架不住!
sxryan
周三, 2007/01/10 - 13:56
Permalink
谢谢! 本来打算写个t
谢谢!
本来打算写个trigger过了就可以了,现在只能写程序了。