1.主键:每个表中最多只能有1个主键,且主键的值不能重复,通过主键可以唯一的确定一条记录。当我们在创建表的时候就声明了主键的话,Mysql就会对我们插入的每一条记录进行检验,若有主键值相同时就会报错。另外主键是默认NotNull的。
声明主键的两种方式:
主键只是单个列时(比如设置学生的学号为主键):
Stu_id int( 5 ) primary key;
主键是多个列时 :
primary key(列名1,列名2。。。);
主键和唯一性约束的区别:
都保证了列或列组合的唯一性;但是主键在一个表中只能有一个,唯一性约束可以存在多个;主键不允许为空,唯一性约束可以为空的。
2.外键:在两个关系中存在公共的若干个字段,且在一个关系中这些公共字段是主键就称该表为主表,另一个关系就称为从表并称这些公共字段为外键。外键主要目的是将两张表形成关联,即就是可以通过从表的外键来引用从表中其他列的值或者空值。
定义的语法格式:
在创建从表的同时创建外键
constraint [ 外键的名称 ] foreign key (列1,列2。。。) refferences 父表名(父列1,父列2。。。)
创建表的时候没有外键关系
ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)
(建立外键时:先创建主表(被应用的表),再是从表 删除外键时:先删除从表,再是主表)
#创建外键方式:在创建从表的同时创建外键
(grade是主表,student是从表)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
--学生表的gradeid字段要去引用年纪表达的gradeid字段
--定义外键key
--给这个外键添加约束(执行引用) references 引用
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
#创建表的时候没有外键关系
ALTER TABLE 'student'
ADD CONSTRAINT 'FK_gradeid' FOREIGN KEY('gradeid') REFERENCES `grade` (`gradeid`)
以上操作都是物理外键,数据库级别的外键,我们不建议使用(避免数据库过多造成困扰),可以用程序去实现外键(应用层解决)。
3.数据的管理:
数据库操作语言(DML):用于操作数据库对象中所包含的数据。
3.1 INSERT:添加数据语句
语法:insert into 表名 (字段名1,字段2,字段3) value (值1,值2。。。);
字段是可以省略的,但是后面的值要与表里的列一一对应
INSERT INTO `school`.`grade`(`GradeID`,`GradeName`) VALUE ('7','大六'); (注意数据库名,表名,字段名用 ` ` 括起来,普通的字符串用 ' '括起来)
INSERT INTO `school`.`test` (`coll`) VALUE ('row1'),('row2'),('row3'); (多行插入)
3.2 UPDATE:更新数据语句
UPDATE `school`.`grade` SET `GradeName`='工科实验班',`GradeID`='100' WHERE `GradeID`='5';
语法:update 表名 set 列名1=值1,列名2=值2 where 列=目标列
列名为要修改的列, where后面是具体的条件,略写时修改所有列的数据
3.3 DELETE:删除数据语句
DELETE FROM `school`.`grade` WHERE `GradeID`='8';
语法:delete from 表名 [where condition];
注意:condition为筛选条件,如果不指定则删除表的所有列数据
TRUNCATE:用于完全清空表数据,表的结构,索引,约束等不变
TRUNCATE TABLE `school`.`grade`;
语法:TRUNCATE [TABLE] table_name;
DELETE和TRUNCATE区别
- 相同点:都能删除数据,都不会删除表结构
- 不同:TRUNCATE不会对事务有影响,删除后自增的当前值会从初始值开始重新记录,计数器会归零。
了解即可: 若使用DELETE删除,重启数据库后
- InnoDB 自增列会从1开始(存在内存当中的,断电即失)
- MyLSAM 继续从上一个自增量开始(存在文件中的,不会丢失)