日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

关于mysql触发器的问题:执行事件插入的字段是否一定要满足字段的所有约束条件?

發布時間:2024/4/18 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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触发器的问题:执行事件插入的字段是否一定要满足字段的所有约束条件?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。