MYSQL如何禁用某个触发器

zuoxingyu 2010-08-17 02:07:11
如题。
触发器存在,只是禁用。
类似alter table 表名 disable trigger 触发器名称

13.1.2. ALTER TABLE语法
ALTER [IGNORE] TABLE tbl_name
alter_specification [, alter_specification] ...

alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD INDEX [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
UNIQUE [index_name] [index_type] (index_col_name,...)
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_options
| partition_options
| ADD PARTITION partition_definition
| DROP PARTITION partition_names
| COALESCE PARTITION number
| REORGANIZE PARTITION partition_names INTO (partition_definitions)
| ANALYZE PARTITION partition_names
| CHECK PARTITION partition_names
| OPTIMIZE PARTITION partition_names
| REBUILD PARTITION partition_names
| REPAIR PARTITION partition_names


MYSQL语法里没有。
或许有其他某些变通的方式可以实现。
感谢各位了。
...全文
1097 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilinew 2011-03-10
  • 打赏
  • 举报
回复
于非空的MyISAM表,需要用alter table xxx disable keys禁用索引,导入完成之后再用alter table xxx enable keys打开。


禁用: alter table 表名 disable trigger 触发器名
启用: alter table 表名 enable trigger 触发器名

--禁用某个表的所有触发器
alter table 表名 disable trigger all

--启用某个表的所有触发器
alter table 表名 enable trigger all

--禁用某个表的指定触发器
alter table 表名 disable trigger 触发器名

--启用某个表的指定触发器
alter table 表名 enable trigger 触发器名
分类: SqlServer 可惜不是mysqld


MYSQL如何禁用某个触发器
如题。
触发器存在,只是禁用。
类似alter table 表名 disable trigger 触发器名称
13.1.2. ALTER TABLE语法
ALTER [IGNORE] TABLE tbl_name
alter_specification [, alter_specification] ...
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD INDEX [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
UNIQUE [index_name] [index_type] (index_col_name,...)
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_options
| partition_options
| ADD PARTITION partition_definition
| DROP PARTITION partition_names
| COALESCE PARTITION number
| REORGANIZE PARTITION partition_names INTO (partition_definitions)
| ANALYZE PARTITION partition_names
| CHECK PARTITION partition_names
| OPTIMIZE PARTITION partition_names
| REBUILD PARTITION partition_names
| REPAIR PARTITION partition_names
MYSQL语法里没有。
或许有其他某些变通的方式可以实现。
感谢各位了。
TOP 回复 引用

天天97
2楼 发表于 2010-09-07 18:13
SQL code
DROP TABLE IF EXISTS test ;
CREATE TABLE test (iss int);
delimiter $$
CREATE TRIGGER trIn
AFTER INSERT ON test
FOR each ROW
BEGIN
IF (select count(*) from information_schema.tables where table_name='xxx')=0
THEN
SET @n=1; ----你要做的操作
ELSE
SET @n=2; ----这里你可以随意写个东西 反正就是不触发本来的操作
END IF ;
END;
$$
delimiter ;
--test
mysql> set @N=0;
Query OK, 0 rows affected (0.00 sec)
mysql> create table xxx(a int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert test select 1;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select @n;
+------+
| @n |
+------+
| 2 |
+------+
lilinew 2011-03-10
  • 打赏
  • 举报
回复
很想知道 我一直需要这个功能的
索引是可以 disable的
ACMAIN_CHM 2010-08-19
  • 打赏
  • 举报
回复
没有什么好办法。一般是删除,以后再建。
zuoxingyu 2010-08-17
  • 打赏
  • 举报
回复
兄弟姐妹们。。。。。
zuoxingyu 2010-08-17
  • 打赏
  • 举报
回复
顶起来,哥们,还有什么好办法没?
zuoxingyu 2010-08-17
  • 打赏
  • 举报
回复
是的。。如果我再去修改触发器内容的话,还不如直接干掉来得快呢。

1楼是个好办法,但是触发器一开始就没这么设计,哈哈。
feixianxxx 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zuoxingyu 的回复:]
感谢各位的回复。
事情的原因是这样的。
A主库,B从库,由于业务关系,B库上的某些表新建了一些触发器,但在A库上,是不需要这些触发器的。

现在我想把A,B统一成一个标准库,好用来做发布。这样就必须用B库做标准库了,因为B的库结构要比A完整。但是怎么样使A上的那些触发器不执行呢?

删除掉是个办法。
[/Quote]
你的意思是 触发器内容是不可以修改了?
feixianxxx 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vipper23 的回复:]
启用的时候可以删掉insert 或者delete那行嘛。。。
[/Quote] 也是
zuoxingyu 2010-08-17
  • 打赏
  • 举报
回复
感谢各位的回复。
事情的原因是这样的。
A主库,B从库,由于业务关系,B库上的某些表新建了一些触发器,但在A库上,是不需要这些触发器的。

现在我想把A,B统一成一个标准库,好用来做发布。这样就必须用B库做标准库了,因为B的库结构要比A完整。但是怎么样使A上的那些触发器不执行呢?

删除掉是个办法。
vipper23 2010-08-17
  • 打赏
  • 举报
回复
启用的时候可以删掉insert 或者delete那行嘛。。。
feixianxxx 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vipper23 的回复:]
SQL code
mysql> create trigger tr_1 after insert on a for each row
-> begin
-> insert into b select new.id;
-> delete from b where id =new.id;
-> end;
->

不知这样算不算变通的办法?
[/Quote]
...这样的话...触发器想用的时候不是就不能用啦
vipper23 2010-08-17
  • 打赏
  • 举报
回复

mysql> create trigger tr_1 after insert on a for each row
-> begin
-> insert into b select new.id;
-> delete from b where id =new.id;
-> end;
->

不知这样算不算变通的办法?
feixianxxx 2010-08-17
  • 打赏
  • 举报
回复
DROP TABLE IF EXISTS test ;
CREATE TABLE test (iss int);


delimiter $$
CREATE TRIGGER trIn
AFTER INSERT ON test
FOR each ROW
BEGIN
IF (select count(*) from information_schema.tables where table_name='xxx')=0
THEN
SET @n=1; ----你要做的操作
ELSE
SET @n=2; ----这里你可以随意写个东西 反正就是不触发本来的操作
END IF ;
END;
$$

delimiter ;


--test

mysql> set @N=0;
Query OK, 0 rows affected (0.00 sec)

mysql> create table xxx(a int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert test select 1;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select @n;
+------+
| @n |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
feixianxxx 2010-08-17
  • 打赏
  • 举报
回复
我不清楚语法是否有没有

我这有个变通的方法:

你在你的指定触发器里加上这么一句

if (select count(*) from information_schema.tables where table_name='xxx')>0
then
这里就是不写什么..
end if;
else
你触发器真正要做的事情

然后当你想禁用这个触发器的时候
你就家里那个XXX的表 然后执行你的语句
这样触发器探测到这个xxx表存在 就啥都不做了。。

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧