目录
一.复制表的结构
方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下。
create table 新表名 like 源表
方法二:在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。
create table 新表名 select * from 源表
方法三:如果已经存在一张机构一致的表,复制数据
insert into 表 select * from 原表;
二.表约束(Constraints)
约束用于规定表中的数据规则,如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
SQL CREATE TABLE + CONSTRAINT 语法:
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
-- 列名 数据类型 约束名
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
大部分数据库支持下面约束: :
- NOT NULL(非空):指示某列不能存储 NULL 值。
- UNIQUE(唯一键):保证某列的每行必须有唯一的值。
- PRIMARY KEY(主键):NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY(外键):保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK(检查):保证列中的值符合指定的条件。
- DEFAULT(默认值):规定没有给列赋值时的默认值。
1.NULL约束
列级约束,只能使用列级约束语法定义。确保字段值不允许为空,只能在字段级定义
--创建表时:
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) NOT NULL
)AUTO_INCREMENT=1;
--修改表时:
ALTER TABLE tb_student MODIFY NAME VARCHAR(18) NOT NULL;
注:所有数据类型的值都可以是NULL;空字符串不等于NULL;0也不等于NULL。
auto_increment :自动增长,为新的行产生唯一的标识, 一个表只能有一个auto_increment,且该属性必须为主键的一部分。auto_increment的属性可以是任何整数类型
2.UNIQUE约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值;唯一性约束条件的字段允许出现多个NULL;同一张表内可建多个唯一约束;唯一约束可由多列组合而成;建唯一约束时MySQL会为之建立对应的索引。如果不给唯一约束起名,该唯一约束默认与列名相同。
--创建表时:
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) UNIQUE NOT NULL
);
--修改表时:
ALTER TABLE tb_student ADD UNIQUE (NAME)
3.PRIMARY KEY约束
不能有NULL值;主键从功能上看相当于非空且唯一;一个表中只允许一个主键;主键是表中唯一确定一行数据的字段;删除表的约束;自动增长和默认值;存储引擎;主键字段可以是单字段或者是多字段的组合;当建立主键约束时,MySQL为主键创建对应的索引;主键约束名总为PRIMARY。
--创建表时:
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18)
);
--修改表时:
ALTER TABLE tb_student ADD PRIMARY KEY (id)
4.FOREIGN KEY约束
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系;
外键确保了相关的两个字段的两个关系:1.子(从)表外键列的值必须在主表参照列值的范围内,或者为空(也可以加非空约束,强制不允许为空)。2.当主表的记录被子表参照时,主表记录不允许被删除。
外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
格式FOREIGN KEY (外键列名)REFERENCES 主表(参照列)
--创建表时:
CREATE TABLE tb_dept(
dept_id INT PRIMARY KEY,
NAME VARCHAR(18),
description VARCHAR(255)
);
CREATE TABLE tb_employee(
employee_id INT PRIMARY KEY,
NAME VARCHAR(18),
gender VARCHAR(10),
dept_id INT REFERENCES tb_dept(dept_id),
address VARCHAR(255)
);
--修改表时:
ALTER TABLE tb_employee
ADD FOREIGN KEY (dept_id)
REFERENCES Persons(dept_id)
5.CHECK约束
注意检查约束在8.0之前,MySQL默认但不会强制的遵循check约束(写不报错,但是不生效,需要通触发器完成),8之后就开始正式支持这个约束了。
--创建表时:
create table t3(
id int,
age int check(age > 18),
gender char(1) check(gender in ('M','F'))
);
--修改表时:
ALTER TABLE t3 ADD CONSTRAINT chk_t3 CHECK (age > 18 AND gender in ('M','F'))
6.DEFAULT约束
可以使用default关键字设置每一个字段的默认值。
--创建表时:
CREATE TABLE user(
sex TINYINT(1) DEFAULT 1 COMMENT '性别 1男 0女',--默认sex值为1
);
--修改表时:
ALTER TABLE user ALTER sex SET DEFAULT '1'
三.删除表的约束
删除NOT NULL约束:
alter table 表名 modify 列名 类型;
删除UNIQUE约束:
alter table 表名 drop index 惟一约束名;
删除PRIMARY KEY约束:
alter table 表名 drop primary key;
删除FOREIGN KEY约束:
alter table 表名 drop foreign key 外键名;