时间:2021-07-01 10:21:17 帮助过:18人阅读
【数据库设计的三大范式】
1.第一范式(1NF):数据表中的每一列(字段),必须是不可拆分的最小单元。也就是说
要确保每一列的原子性。
2.第二范式(2NF):满足1NF后,要求表中的所有列都必须依赖于主键,而不能有任何一列与主键
没有关系。也就是说,一个表只描述一件事情。
例如:订单表,只能描述订单相关的信息,所以所有的字段必须与订单ID相关;
产品表,只能描述产品相关的信息,所以所有的字段必须与产品ID相关;
因此:不能在同一张表中,同时出现订单信息和产品信息。
3.第三范式(3NF):满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关。
(表中的每一列,都只能依赖于主键)
例如:订单表中,需要有客户相关信息,在分离出客户表之后。
订单表中,只需要有一个用户ID即可。而不能有其他的客户信息。因为,其他的
用户信息是直接关联与用户ID,而不是关联与订单ID。
【第二范式与第三范式的本质区别】
在于有没有分出两张表,第二范式是说一张表中包含了多种不同的实体的属性,
那么必须要分成多张表。第三范式要求,已经分好了多张表的话,那么,一张表中只能有另一张
表中的ID(主键),而不能有其他的任何信息(其他任何信息,一律用主键在另一张表中查询)。
USE mydb;
-- 创建表:
-- IF NOT EXISTS 可以省略,省略后重复创建报错。
-- 定义列:列名 数据类型 列定义关键字
-- 常用的列定义关键字:
-- UNSIGNED:设置列为无符号列。 无符号只能限制类型为数字类型的列。
-- AUTO_INCREMENT:设置列为自动增长列。
-- 自动增长必须是主键!!主键不一定是自动增长,但一定是UNIQUE
/*【主键】
1.主键注意事项:主键默认非空!主键默认唯一性约束!
只有主键才能设置自动增长(主键不一定自增,自增必须是主键)
2.设置主键的方式?
① 在列定义的时候:id int PRIMARY KEY
② 在列定义完成后设置: PRIMARY KEY(id)
PRIMARY KEY:设置主键约束。
NOT_NULL:设置非空约束。
UNIQUE:设置唯一性约束,该字段不能出现重复值。UNIQUE的可以是任意字段。
DEFAULT:默认值约束。heighe DOUBLE(3,2) DEFAULT 1.2 heigh如果不输入默认为1.2
FOREIGN KEY: 设置外键约束
【外键】
1.设置外键的注意事项:
① 只有INNODB的数据库引擎支持外键
修改my.ini文件设置default-storge-engin=INNODB
② 外加与参照列的数据类型必须相同。
(数值型要求长度和无符号都相同,字符串要求类型相同,长度可以不同。)
③ 设置外键的字段必须要有索引。如果没有索引,设置外键时会自动生成索引。
2.设置外键的语法:
[CONSTRAINT 外键名] FOREIGN KEY (外键字段) REFERENCES 参照表(参照字段)
3.外键约束的参照操作:
参照操作:当对参照表的参照字段进行删除或更新时,外键表中的外键如何应对。
参照操作可选值: RESTRICT 拒绝参照表删除或更新参照字段。(默认)
no action 与 RESTRICT 相同,但这个指令只在MySql生效
CASCADE 删除或更新参照表的参照字段时,外键表的记录同步删除更新
SET NULL 删除或更新参照表的参照字段时,外键表的外键设为NULL
*/
DROP TABLE IF EXISTS tbl;
-- IF NOT EXISTS 创建表时会确认表是否存在,存在就不执行了
CREATE TABLE IF NOT EXISTS tbl(
id INT(1) UNSIGNED PRIMARY KEY auto_increment,
`name` VARCHAR(255) not NULL,-- name 是系统关键字,所以使用反引号包裹
age TINYINT(3) ,
height DOUBLE(3,2) DEFAULT 1.2,
clsId INT UNSIGNED,
CONSTRAINT tbl_fk_classes FOREIGN KEY (clsid) REFERENCES
)auto_increment=8 default-ENGINE;
DROP TABLE IF EXISTS `cls`;
CREATE TABLE IF NOT EXISTS cls(
id INT UNSIGNED PRIMARY KEY auto_increment,
classname VARCHAR(255) not NULL
);
-- SHOW COLUMNS FROM cls;
DROP TABLE IF EXISTS `user`;
CREATE TABLE IF NOT EXISTS `user`(
id INT UNSIGNED PRIMARY KEY auto_increment,
clsId INT UNSIGNED ,
`name` varchar(255) not null,
CONSTRAINT aaa FOREIGN KEY (clsId) REFERENCES cls(id) ON DELETE SET NULL ON UPDATE CASCADE
);
SHOW TABLES;
-- 显示表结构 COLUMNS
SHOW COLUMNS from tbl;
-- 显示表的建表语句
SHOW CREATE TABLE tbl;
-- 删除表(如果存在则删除)
DROP TABLE IF EXISTS tbl;
-- 修改表名
-- 1.alter table 旧表名 RENAME [to] 新表名;
ALTER TABLE tbl RENAME tbl2;
-- 2.同时修改多表:rename TABLE 旧表名 to 新表名[, 另一个旧表名 TO 另一个新表名];
RENAME TABLE tbl2 TO tbl1;
-- 修改字段 列
-- ALTER TABLE 表名 CHANGE 旧列名 新列名 列定义 [FIRST | AFTER 某一列列名]
-- FIRST将此字段调整为表格第一列,after 将一列放到某一列后面。
ALTER TABLE tbl CHANGE `name` `username` VARCHAR(200) not NULL after age
-- MODIFY只修改列定义,不能修改列名
ALTER TABLE tbl MODIFY `name` VARCHAR(200) not NULL AFTER age
-- 删除表中某一列
ALTER TABLE tbl DROP height
-- 为表新增某一列
ALTER TABLE tbl ADD height DOUBLE(3,2) DEFAULT 1.2 AFTER age
-- 为表新增多列,不能调整列的位置,只能插在最后。
ALTER TABLE tbl ADD(
weight DOUBLE(3,2) UNSIGNED,
school VARCHAR(255)
);
-- 增加主键约束
ALTER TABLE tbl ADD PRIMARY KEY(age)
-- 删除主键约束
ALTER TABLE tbl DROP PRIMARY KEY
-- 新增唯一性约束
ALTER TABLE tbl ADD UNIQUE KEY(username)
-- 删除唯一性约束:由于创建唯一性约束会默认创建索引,所以删除时,需删除索引。
ALTER TABLE tbl DROP INDEX username
-- 设置默认值约束
ALTER TABLE tbl ALTER age SET DEFAULT 20;
-- 删除默认值约束
ALTER TABLE tbl ALTER age DROP DEFAULT;
-- 设置外键约束(按照外键名删除外键)
ALTER TABLE tbl add constraint waijianming foreign key (clsId)
REFERENCES cls(id) on delete set null update cascade;
-- 删除外键约束。由于创建外键时会默认创建索引,所以删除外键后,需要再删除索引
ALTER TABLE tbl DROP FOREIGN KEY aaa;
ALTER TABLE tbl DROP INDEX aa
MySql初步学习
标签:ping 连接 结构 create lte logs constrain 1.2 cti