关于mysql触发器的问题:执行事件插入的字段是否一定要满足字段的所有约束条件?
生活随笔
收集整理的這篇文章主要介紹了
关于mysql触发器的问题:执行事件插入的字段是否一定要满足字段的所有约束条件?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先是一個product表,如下:
mysql> show create table product\G *************************** 1. row ***************************Table: product Create Table: CREATE TABLE `product` (`id` int NOT NULL,`name` varchar(20) NOT NULL,`functionn` varchar(50) NOT NULL,`address` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)再就是建立一個operate表
mysql> show create table operate\G *************************** 1. row ***************************Table: operate Create Table: CREATE TABLE `operate` (`op_id` int NOT NULL AUTO_INCREMENT,`op_type` varchar(20) NOT NULL,`op_time` time NOT NULL,PRIMARY KEY (`op_id`),UNIQUE KEY `op_id` (`op_id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)?下面建立一個觸發器,注意operate表的第一個字段op_id是not null的,但是建立trigger的時候,卻給operate首個字段賦值
null,如下:
mysql> show triggers\G *************************** 1. row ***************************Trigger: product_bf_insertEvent: INSERTTable: productStatement: insert into operate values(null,'insert product',current_time)Timing: BEFORECreated: 2020-07-23 22:25:41.89sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONDefiner: skip-grants user@skip-grants host character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci *************************** 2. row ***************************執行前,先查看operate表和product表的內容:
mysql> select * from operate; +-------+----------------+----------+ | op_id | op_type | op_time | +-------+----------------+----------+ | 1 | insert product | 22:45:10 | | 3 | insert product | 22:53:18 | | 5 | insert product | 22:54:54 | | 6 | insert product | 09:32:45 | +-------+----------------+----------+ 4 rows in set (0.00 sec) mysql> select * from product; +----+-------+-----------+---------+ | id | name | functionn | address | +----+-------+-----------+---------+ | 1 | name1 | function1 | address | | 2 | name1 | function1 | address | | 3 | name1 | function1 | address | | 4 | name1 | fucntion1 | address | +----+-------+-----------+---------+ 4 rows in set (0.00 sec)下面開始執行觸發器觸發事件(向product表中插入字段),如下:
mysql> insert into product values(5,'name2','function2','address1'); Query OK, 1 row affected (0.01 sec)查看 執行語句是否執行,查看operate表:
mysql> select * from operate; +-------+----------------+----------+ | op_id | op_type | op_time | +-------+----------------+----------+ | 1 | insert product | 22:45:10 | | 3 | insert product | 22:53:18 | | 5 | insert product | 22:54:54 | | 6 | insert product | 09:32:45 | | 7 | insert product | 09:42:53 | +-------+----------------+----------+ 5 rows in set (0.00 sec)結論:執行事件中遇到not null字段(本文是primary key的not null字段),那么可以插入null?
也就是執行事件可以不滿足原來表的定義嗎?
?
再來一個定義:
可以看出table_test表中第一個字段id是not null的
mysql> show create table table_test; +------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+ | table_test | CREATE TABLE `table_test` (`id` int NOT NULL,`name` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+?建立表t1
mysql> show create table t1; +-------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` (`id` int NOT NULL,`time_of_now` time DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)建立觸發器,
mysql> create trigger trigger_2-> after insert-> on t1-> for each row-> insert into table_test values(null,'name'); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values(1,now()); ERROR 1048 (23000): Column 'id' cannot be null這里怎么又不行了呢?
把table_test 的id字段增加一個約束auto_increment,就可以插入null了,此時即使有not null也可以插入null
之后便可以插入null了。原來是有auto_increment就可以這么無視not null.
結論:auto_increment字段不論是不是not null,插入null后都是合法的。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的关于mysql触发器的问题:执行事件插入的字段是否一定要满足字段的所有约束条件?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ERROR 1136 (21S01):
- 下一篇: MySQL DELETE 语句的一个简单