mysql

一:规范化

  1NF:若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式.

  2NF:若关系模式R包含于1NF(符合第一范式),且每一个非主属性完全依赖于码,则关系模式R包含于2NF

  3NF:若关系模式R(U,F)中若不存在这样的码X,属性组Y及非主属性Z(Z不是Y的真子集)使得X-->Y(Y-/->X),Y-->Z成立,则关系模式R包含于3NF(即当2NF消除了非主属性对码的传递依赖函数,则称为3NF).

    U为属性集,F是U上的一组函数依赖.

  

#mysql添加索引命令
#创建脚本
#1.PRIMARY KEY(主键索引)
#mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
#2.UNIQUE(唯一索引)
#mysql>ALTER TABLE `table_name` ADD UNIQUE (`column` )
#3.INDEX(普通索引)
#mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
#4.FULLTEXT(全文索引)
#mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
#5.多列索引
#mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
/*
描述:
PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允许有重复。
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。
*/
测试外键约束,和级联更新,级联删除
CREATE TABLE `user`
(
`id` INT(10) unsigned PRIMARY KEY NOT NULL COMMENT '用户编号' AUTO_INCREMENT,
`user_name` VARCHAR(25) COMMENT '用户名称',
`description` VARCHAR(25) COMMENT '描述'
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT user VALUES (1 ,'泥瓦匠','他有一个小网站 bysocket.com');
INSERT user VALUES (2 ,'泥瓦匠','他有一个小网站 bysocket.com');
/* 外键约束*/
DROP TABLE `t_address`;
CREATE TABLE `t_address`(#反引号一般在Esc键的下方,和~在一起。它是为了区分MySQL的保留字与普通字符而引入的符号。 '字符串' like _一个字符 %多个字符
`id` int(11) NOT NULL AUTO_INCREMENT,
`province` varchar(32) DEFAULT NULL,
`city` varchar(32) DEFAULT NULL,
`detialAddress` varchar(200) DEFAULT NULL,
`user_id` int(10) unsigned DEFAULT NULL ,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `t_address_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO t_address(province, city, detialAddress, user_id) VALUES ('河南','安阳','文峰区','1');
INSERT INTO t_address(province, city, detialAddress, user_id) VALUES ('河南','安阳','文峰区','2');
SELECT * FROM user;
SELECT * FROM t_address;
UPDATE user SET id = 3 WHERE id=2;
DELETE FROM user WHERE id = 3;
建表之后添加约束: ALTER TABLE t_address ADD CONSTRAINT `user_address_fk1` FOREIGN KEY (`user_id`) REFERENCES user(`id`);# ON UPDATE CASCADE ON DELETE CASCADE ;
建立外键约束时报错:ERROR 1005
已知的原因: 

1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED(有符号数,无符号数), 这两字段必须严格地一致匹配. 

2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是primary key 的放,你必须为它创建一个索引。 (我遇上到错误)

3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。 

4, 其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型 

5, 你可能设置了ON DELETE SET NULL, 但是相关的键的字段又设置成了NOTS NULL 值。你可能通过修改cascade 的属性值或者把字段属性设置成 allow null 来搞定这个bug. 

6, 请确定你的Charset 和 Collate 选项在表级和字段级上的一致 

7, 你可能设置为外键设置了一个默认值,如 default=0 

8, 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。 

9, ALTER 声明中有语法错误 

10. 要连接的两个表的编码格式不同



你可能感兴趣的:(mysql)