注
Navicat建完表要刷新才能显示
语句最后要加 ; Navicat可不加
外键约束是在子表中设置的,用来引用父表中的一列或多列。只需要在子表中设置外键约束,而不需要在父表中进行设置。给子表设置外键时会自动在父表中给父表被引用的外键添加一个索引。——改进:子表在后端 在逻辑上设置关联即可,不要在数据库中设置物理外键约束,那很容易出问题。。
建表
CREATE TABLE IF NOT EXISTS token (
token_id INT(11) KEY NOT NULL,
user_id INT(11) NOT NULL,
token VARCHAR(800) NOT NULL,
entire_time BIGINT not NULL COMMENT '过期时间戳'
);
CREATE TABLE `user_info` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR ( 255 ) NOT NULL,
`nick_name` VARCHAR ( 64 ) CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`avatar_url` VARCHAR ( 255 ) CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`gender` TINYINT DEFAULT NULL,
`Introduction` VARCHAR ( 255 ) DEFAULT NULL,
`address` VARCHAR ( 255 ) DEFAULT NULL,
`age` INT DEFAULT NULL,
`bg_img_url` VARCHAR ( 255 ) DEFAULT NULL,
PRIMARY KEY ( `id` ),
KEY `user_id` ( `user_id` ),
CONSTRAINT `user_id` FOREIGN KEY ( `user_id` ) REFERENCES `token` ( `user_id` )
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
改表
-- 非负、自增、非空
ALTER TABLE user_info
MODIFY COLUMN id INT UNSIGNED AUTO_INCREMENT NOT NULL;
-- 删除 `smart_community`.`user_info` 表中的 `token` 列。
ALTER TABLE `smart_community`.`user_info`
DROP COLUMN `token`,
-- 修改 `gender` 列,将其设置为可为空,并在 `avatar_url` 列之后。
MODIFY COLUMN `gender`
tinyint NULL DEFAULT NULL
AFTER `avatar_url`;
-- 修改 `id` 列,将其设置为非空、自增,并移动到第一列。
MODIFY COLUMN `id`
int NOT NULL AUTO_INCREMENT FIRST,
-- 在表中添加一个名为 `user_id` 的新列,该列不允许为空,并在 `id` 列之后。
ADD COLUMN `user_id`
int NOT NULL
AFTER `id`,
-- 在表中添加一个名为 `bg_img_url` 的新列,该列允许为空,并在 `age` 列之后。
ADD COLUMN `bg_img_url`
varchar(255) NULL
AFTER `age`;
-- 在 `smart_community`.`user_info` 表中添加一个索引,用于加速对 `user_id` 列的查询。
ALTER TABLE `smart_community`.`user_info`
ADD INDEX(`user_id`);
-- 更改 `smart_community`.`token` 表中的列名,将其从 `token_id` 更改为 `id`
--并将其设置为非空、自增,并移动到第一列。
ALTER TABLE `smart_community`.`token`
CHANGE COLUMN `token_id` `id` int NOT NULL AUTO_INCREMENT FIRST,
-- 删除原来的主键约束,并添加一个新的主键约束,使用B树索引。
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`) USING BTREE,
-- 添加一个名为 `user_id` 的外键约束,它引用了 `smart_community`.`user_info` 表中的 `user_id`,
--并指定了当父表(即 user_info 表)中的行被删除或更新时,子表(即 token 表)中匹配的行也会被删除或更新。
ADD CONSTRAINT `user_id`
FOREIGN KEY (`user_id`)
REFERENCES `smart_community`.`user_info`
(`user_id`)
ON DELETE CASCADE
ON UPDATE CASCADE;
--在house_rent表中添加两个新的字段,分别是create_time和update_time
--默认值均为当前时间戳,且update_time字段在更新记录时自动更新为当前时间戳
ALTER TABLE house_rent ADD COLUMN create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';
ALTER TABLE house_rent ADD COLUMN update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间';
触发器
CREATE TRIGGER update_notice -- 创建触发器,名称为update_notice
BEFORE INSERT ON notice -- 在插入操作之前触发该触发器,应用于notice表
FOR EACH ROW -- 对于每一行数据都执行以下操作
BEGIN -- 触发器执行的开始标识
IF NEW.update_time IS NULL THEN -- 如果新插入的行中的update_time字段为空
-- 将update_time字段设置为create_time字段的值
SET NEW.update_time = NEW.create_time;
-- 如果update_time字段不为空,但其值小于create_time字段的值
ELSEIF NEW.update_time < NEW.create_time THEN
-- 抛出一个SQLSTATE为'45000'的错误信号,并设置错误信息
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '更新时间不能早于创建时间';
END IF; -- 条件判断结束标识
END; -- 触发器执行的结束标识