eg1
CREATE TABLE emp1(
emp_no INT PRIMARY KEY,
e_name VARCHAR(30) NOT NULL,
e_gender INT CHECK(e_gender=1 OR e_gender=0),
e_age INT CHECK(e_age>=0 AND e_age<=100),
e_sal FLOAT NOT NULL,
e_hit  DATE NOT NULL,
e_email VARCHAR(50) UNIQUE,
e_address VARCHAR(100) DEFAULT '住址不详'
)

eg2
CREATE TABLE emp5(
emp_no INT ,
e_name VARCHAR(30) NOT NULL  UNIQUE,
e_gender INT CHECK(e_gender=1 OR e_gender=0),
e_age INT CHECK(e_age>=0 AND e_age<=100),
e_sal FLOAT  NOT NULL,
e_hit  DATE NOT NULL,
e_email VARCHAR(50) ,
e_address VARCHAR(100)  DEFAULT '住址不详',
  PRIMARY KEY(emp_no),
UNIQUE(e_email)
)


约束

1.主键约束
    主键作用:唯一区分一条记录(一个实体)
    如何选择主键:
        a.非空    唯一
        b.稳定的列
        c.选择最少的列
    注意:
        一张表中可以没有主键
        最多只能有一个主键
        可以是单列,也可以是多列

语法格式分以下两种情况;
    a.在定义列的同时指定主键
        字段名  数据类型  PRIMARY KEY [默认值]
CREATE TABLE tb_emp1
(
    id  INT(11) PRIMARY KEY,
    ...
);
    b.在定义完所有列之后指定主键
        [CONSTRAINT <约束名>] PRIMARY KEY [字段名]
CREATE TABLE tb_emp2
(
    id  INT(11),
    ...
    PRIMARY KEY(id)
);

    多字段联合主键:主键由多个字段联合组成
        PRIMARY KEY[字段1,字段2,...,字段n]
-- 选课  创建复合主键
CREATE TABLE xuanke(
  id  INT,-- 学号  
  c_id INT , -- 课程
  score FLOAT ,
  PRIMARY KEY(id,c_id)
)

--  使用自增列  AUTO_INCREMENT

CREATE TABLE xuanke(
  xk_id INT  PRIMARY KEY AUTO_INCREMENT,  -- 默认从1开始 +1
  id  INT,-- 学号  
  c_id INT , -- 课程
  score FLOAT
  -- PRIMARY KEY(id,c_id)
)AUTO_INCREMENT=100


2.外键约束
    外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值

    外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的租用是保持数据的一致性、完整性

    主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表
    从表(字表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表

    语法规则:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1[,字段名2,...]
    REFERENCES <主表名> 主键列1[,主键列2,...]

关联指的是在关系型数据库中,相关表之间的联系,它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时就会报错


3.非空约束
    非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错

    语法规则:
    字段名  数据类型  NOT NULL


4.唯一性约束
    唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值

    语法规则:
    (1)在定义完列之后直接指定唯一约束
        字段名  数据类型  UNIQUE
    (2)在定义完所有列之后指定唯一约束
        [CONSTRAINT <约束名>] UNIQUE(<字段名>) 

UNIQUE和PRIMARY KEY的区别:
        一个表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY 
声明;
        声明为PRIMARY KEY的列不允许有空值,但是声明为UNIQUE的字段允许空值(NULL)的存在


5.默认约束
    默认约束(Default Constraint)指定某列的默认值。插入记录时如果没有给这个字段赋值,那么系统会自动为这个字段赋值为默认值

    语法规则:
    字段名  数据类型  DEFAULT  默认值


6.设置表的属性值自动增加
    在MySQL中AUTO_INCREMENT的初始值是1,每新增一条记录,字段值会自动加1。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINT、INT、BIGINT等)

    语法规则:
    字段名  数据类型  AUTO_INCREMENT


CREATE TABLE   test
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
) AUTO_INCREMENT = 100;

可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

alter table tbname auto_increment = x ;
设置表tbname的唯一auto_increment字段起始值从x开始,如果此表数据量很多的话,这样执行起来会很慢.

AUTO_INCREMENT说明:
(1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
(2)把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
(3)当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
(4)当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
(5)如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。