表的约束

数据库的操作

  • 数据库的创建 :create database 数据库名 charset utfs8;

  • 查看数据库 : show

    show databasel;
    show create database db;
    select database;
    
  • 选择数据库 : use 数据库名;

  • 删除数据库 : drop database 数据库名;

  • 修改数据库 : alter database db1 charset utf8;

数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

基本数据类型

表table的创建

-- 学号 姓名      性别  出生日期 入学时间  专业     院系     创建时间
-- int varchar  char  date   date    varchar  varchar timestamp
create table t_student(
    sno int,
    sname varchar(40),
    gender char(1),
    birthday date,
    schooltime date,
    major varchar(255),
    department varchar(255),
    createtime timestamp;
)



create table user(
    id int(10) primary key,
    uname varchar(40),
    passwd varchar(40),
    phoneNum char(11) unique,
    birthday datetime,
    address varchar(255),
    createtime timestamp default now()
);

create table person(
	xing varchar(40),
    ming varchar(40),
    birthday datetime,
    primary key(xing, ming)
);

表 table的修改

  • 根据查询语句创建表 : create table 表名: as select * from 另外一个表名

    • create table stuo1 as select * from student;
      
  • 添加一列 : alter table 表名 add 列名

    • default 如果不输入 默认输入 sysdate 今天的日期。

      alter table student add birthday date default sysdate;
      
  • 删除一列 : alter table 表名 drop 列名

    alter table student drop column email;
    
  • 修改一列: alter table 表名 modify(要修改的列); modify改的是属性

    • alter table student modify(clazz varchar(20));
      
  • 修改列名 : alter table 表名 rename 旧列名 to 新列名

    • alter table student rename column birthday to birth;
      
  • 修改表名 : rename 旧表名 to 新表名

    • rename student to t_s;
      
  • 删除一张表 : drop table 表名

    • drop table t_S;
      

表 table的约束

  • 约束指的是我们创建的表,别人在插入数据的时候, 对数据的约束,而不是对创建人的约束。

  • 主键约束 primary key

    • 主键值必须唯一标识表中的每一行,且不能为NULL,即表中不可能存在有相同主键值的两行数据。主键列的数据类型不限,但此列必须是唯一并且非空。

    • 主键分为单字段主键和多字段联合主键

      • 单字段主键

        -- 在定义字段时指定主键
        CREATE TABLE <数据表>
        (
        	<字段名> <数据类型> PRIMARY KEY  
        );
        
        -- eg: 在数据库中创建数据表table_example1,主键为id
        CREATE TABLE table_example1
        (
        	id INT(10) PRIMARY KEY,
        	name VARCHAR(20)
        );
        
        
        
        -- 在定义完字段后指定主键
        CREATE TABLE <数据表>
        (
        	<字段名> <数据类型> ,
        	PRIMARY KEY(<字段名>)  
        );
        
        
        -- eg:在数据库中创建数据表table_example2,主键为id
        CREATE TABLE table_example2
        (
        	id INT(10),
        	name VARCHAR(20),
        	PRIMARY KEY(id),
        );
        
      • 联合主键

        -- 在定义完字段后指定主键
        CREATE TABLE <数据表>
        (
        	<字段1> <数据类型>,
        	<字段2> <数据类型>,
        	PRIMARY KEY(<字段1>,<字段2>)
        );
        
        -- eg:创建数据表table_example3,主键约束为id,name的联合主键
        CREATE TABLE table_example3
        (
        	id INT(10),
        	name VARCHAR(20),
        	PRIMARY KEY(id,name)
        );
        
        
      • 修改属性时添加主键约束

        • -- 修改表table_example4,将id设为主键
          ALTER TABLE table_example4 add primary key (<字段名>); 
          
      • 删除主键

        ALTER TABLE <数据表> drop primary key (<字段名>);
         
         -- 一张表中只有一个主键,所以删除主键约束可以不用指定主键名,两行代码效果一样
        ALTER TABLE <数据表> drop primary key; 
        
    • 联合主键不能包含不必要的多余字段,当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则

      每个表都有一个且只有一个主键。 主键不接受NULL或重复值。如果主键由两列或更多列组成,则值可能在一列中重复,但主键中所有列的值组合必须是唯一的。

      请参阅以下培训(training)表。
      img

      training表的主键包含employee_idcourse_id列。course_id列中的值是重复的,但employee_idcourse_id中的值组合不是重复的。

    • 在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

      通过给字段添加 AUTO_INCREMENT 属性来实现主键自增长。语法格式如下:

      字段名 数据类型 AUTO_INCREMENT

      • 默认情况下,AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1。
      • 一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
      • AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性。
      • AUTO_INCREMENT 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
      • AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。
  • 唯一性约束 unique

    • 被约定的列中的值可以为空但是不能相同

      格式: 列名 <数据类型> unqiue ;

      create table tb_unique01(
      	id int(11) primary key,
          name varchar(22) unique,
          location varchar(50)
      );
      
      • alter table <数据表名> add constraint <唯一的约束名> unique(<列名>) ;

        alter table tb_unique01 add constraint unique_t_unique01_location unique(location);
        
      • alter table <表名> drop index <唯一约束名>

        alter table tb_unique01 drop index unique_t_unique01_location;
        
  • 非空约束 notnull

    • 被约束的列中的值不能为null

      格式: 列名 <数据类型> not null;

      create table tb_null01(
      	id int(11) primary key,
          name varchar(22) not null,
          location varchar(50)
      );
      
    • 将列的属性修改为非空约束。

      alter table <数据表名> change column <字段名> <字段名> <数据类型> not null;

      alter table tb_null01 change column location location varchar(50) not null;
      
    • 删除非空约束。

      alter table <数据表名> change column <字段名> <字段名> <数据类型> null;

      alter table tb_null01 change column location location varchar(50) null;
      
  • 外键约束

  • [外键约束](http://c.biancheng.net/view/2441.html)
    
    • 在定义外键时,需要遵守下列规则:

      • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表就称为参照表,这种结构称为自参照完整性。
      • 必须为主表定义主键。
      • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
      • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候唯一性键。
      • 外键中列的数目必须和主表的主键中列的数目相同。
      • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
    • 外键的删除

      • 级联删除
        • 设置为NULL
        • 阻止删除
        • 删除主表数据的时候,要保证这个ID没有被字表所使用
            • 创建表时设置外键约束:

      constraint <外键名> foreign key (列名, … ) references <主表名> (主键列1, …);

    • -- 1位老师对应N个学生, teacher表为主表, student表为外键表, tid为外键
      create table teacher(
      	tid varchar(40) primary key,
          name varchar(22),
          phonenum varchar(11) unique,
          location varchar(50)
      );
      
      create table student(
      	sid varchar(40) primary  key,
          name varchar(40),
          tid varchar(40),
          constraint fk_teacher_student_tid foreign key(tid) references teacher(tid) on delete cascade
      );
      
      insert into teacher values('a', '岳不群');
      insert into teacher values('b', '定先师太');
      insert into teacher values('c', '无崖子');
      
      insert into student values('1', '令狐冲', 'a');
      insert into student values('2', '岳灵珊', 'a');
      insert into student values('3', '依琳', 'b');
      insert into student values('4', '星宿大仙', 'c');
      -- 错误数据, 因为主表主键没有d
      insert into student values('5', '任我行', 'd');
      
    • 修改表: alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);

    • 删除表: alter table <表名> drop foreign key <外键约束名>;

  • 约束总结

    -- 查看表中的约束
    show create table <数据表名>;
    
    create table table_name(
    	列名1 数据类型 (intprimary key auto_increment,  -- 主键自动递增
        列名2 数据类型 not null-- 非空约束
        列名3 数据类型 unique-- 唯一性约束
        列明4 数据类型 default ‘值’,						-- 取一个默认值
        constraint 索引名 foreign key(外键列) references 主键表(主键列) on delete cascade | on delete set null                         -- 外键约束
    )
    
    1. 主键约束
    添加: alter table table_name add primary key(字段);
    删除: alter table table_name drop primary key; 
    
    2.非空约束
    添加:alter table table_name modify 列名 数据类型 not null;
    删除:alter table table_name modify 列名 数据类型 null3.唯一约束
    添加:alter table table_name add unique 约束名(字段);
    删除:alter table table_name drop key 约束名;
    
    4.自动增长
    添加:alter table table_name modify 列名 int auto_increment;
    删除:alter table table_name modify 列名 int;
    
    5.外键约束
    添加: alter table table_name add constraint 约束名 foreign key(外键列) references 主键表(主键列);
    
    删除:
    第一步:删除外键
    alter table table_name drop foreign key 约束名;
    
    6. 默认值
    添加: alter table table_name alter 列名 set default '值';
    删除: alter table table_name alter 列名 drop default;
    
modify和alter 都可修改,二者区别是什么?

一、功能不同

1、modify:只能修改字段的属性。
2、alter:除了修改字段属性外,还可以做增加删除操作。

二、语法不同

1、modify:修改字段名使用:ALTER TABLE [表名] MODIFY [列名] [数据类型]

2、alter:数据库SQL语言的修改语句,可以用来修改基本表,表示格式为:ALTER TABLE<表名>[改变方式]。

三、范围不同

1、modify:只是alter功能下的一个功能模块。

2、alter:包括“ADD ”、“DROP ”、“CHANGE ”、“MODIFY ”四个功能模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值