MySQL数据管理
1. 主键与外键
1.1 创建主键
关系型数据库中的一条记录有若干个字段(列/属性),若其中某个字段/字段组能够唯一标识一条记录,该字段组就可以成为一个主键,一般情况下主键不具备任何含义,只是用于标识当前记录。
除了在创建表时指定主键外,我们可通过修改表的方式来添加主键,具体如下;
ALTER TABLE 表名 ADD CONSTRAINT 主键名
PRIMARY KEY (主键字段);
1.2 创建外键
外键用于与另一张表的关联,是能够确定另一张表记录的字段,用于保持数据的一致性。外键的特点:从表外键的值时对主表外键的引用,以表外键类型,必须与主表主键类型一致。
ALTER BABLE 从表 ADD CONSTRAINT 外键名称
FOREIGN KEY 从表外键字段名
REFERENCES 主表的外键
[外键名称] 用于删除外键约束,建议 _fk 结尾
在添加外键时可能会出现如err(150)等错误,可能的原因有:
- 外键的引用类型不一样,另一张表的主键时int,而本张表中对应的外键时char等类型。
- 找不到主表中引用的列。
- 主键和外键的字符编码不一致
- 两张表存储引擎不一样。(MyISAM储存引擎不支持外键)
在MySQL中创建外键时经常会遇到问题而失败,这是因为MySQL中还有狠多细节需要留意
- 两个字段的类型或者大小不严格匹配。例如,如果一个时int(10),那么外键也必须设置成int(10),另外还必须确定是否为一个signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配。
- 试图设置外键的字段没有建立起索引,或者不是一个primary key。 如果其中一个不是primary key的话,你必须先为它创建一个索引。
- 其中一个或者两个表是MyISAM引擎的表。若想要使用外键约束,表必须是innoDB引擎。
- 外键的名字不能重复,应该检查数据库以确保外键名字是唯一的。
- 确定Charset和Clooate选项在表级和字段上的一致。
- 可能设置了一个默认值
1.3 外键的使用
在设置好外键以后,我们会发现对应的所设置了外键的表即从表,它的此外键字段取值必须满足一张表(主表)的实际值情况,否则无法储存。
主表:在数据库中建立的表格即Table,其中存在主键(primary key) 用于与其他表想关联,并且作为在主表中的唯一性标识。
从表:以主表的主键(primary key)值为外键(Foreign Key)的表,可以通过外键与主表进行关联查奥逊。
2. DML语句操作数据
2.1 插入数据
插入单条数据
插入数据时类型一定要保持一致。另外除了数值型数据类型,其他类型一定要添加单引号,如果不添加字段名列表,那么必须按照创建表时字段顺序依次进行插入。如果只是想插入表中的部分数据,字段名列表一定要加上。
INSERT INTO 表名 (字段名列表)VALUES(值列表);
- 字段名是可选的,如省略则一次插入所有字段
- 多个列表和多个值之间使用逗号分隔
- 值列表和字段名列表一 一对应
- 如插入的是表中部分数据,字段名列表必填
插入多条数据
INSERT INTO 新表(字段名列表)VALUES (值列表1),(值列表2),(值列表n);
将查询结果插入新表
插入数据只是将数据传递,如果插入到新表,部分约束会传递,但是主键约束和自增不会传递,查询多少字段就在新表中开辟多少字段,如果未*表示全字段。
CREATE TABLE 新表 (SELECT 字段1,字段2...... FROM 原表);
如果不想创建新表,想将数据查询插入到已存在的表,使用第二种方法/
INSERT INTO 目的表(字段列表)查询语句
2.2 修改数据
DDL语句中删除数据库和数据表的关键是DROP。这里DML语句中的删除表中数据是DELETE。还有另一种删除表数据语句未TRUNCATE 语句,它删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE快。但DELETE 不会重置自增序列
UPDATE 表名
SET 字段1 = 值1,字段2 = 值2,....,字段n=值n
WHERE 条件;
2.3 删除数据
DELETE FROM 表名 WHERE 条件;
TRUNCATE TABLE 表名;