mysql数据完整性

** 数据完整性。(数据完整性指的是存储在数据库中的数据的一致性和准确性)
数据完整性分类:
    1、实体完整性
        PRIMARY KEY约束
UNIQUE约束    (唯一值)
自增特性 auto_increment
    2、域完整性
数据类型
非空约束  not null
CHECK约束 MySQL不支持
DEFAULT约束
    3、参照完整性
FOREIGN KEY约束
    4、用户自定义完整性

存储过程和触发器

** 约束。
    1、NOT NULL约束
    功能:限制用户向表中插入数据时,某列必须插入值,不允许为空
    添加约束的方法:在列的定义后面直接添加关键字NOT NULL。(不写默认为NULL)
示例:
    CREATE TABLE student
    (
        stuID CHAR(5) NOT NULL,
        stuName VARCHAR(10) NOT NULL,
        stuSex ENUM('男', '女') #此列允许不插入值
    )


    验证NOT NULL约束的功能
    另一种添加非空约束的方法:、
create table t1(tid NUMBER);
alter table t11 modify tid char(5) not null; 
        (可以既改变类型,又添加约束)

    2、DEFAULT约束
    当INSERT语句没有指定值时,DEFAULT约束会在列中输入一个默认值。
    定义DEFAULT约束的语法 :
    DEFAULT constraint_expression

    MySQL中的默认值约束有一个限制,即:默认值只能是一个常量,不能象Oracle那样允许函数。
    只有一个例外:CURRENT_TIMESTAMP
    下面这些语句是等效的: 
CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
      ON UPDATE CURRENT_TIMESTAMP);

    3、PRIMARY KEY约束
    PRIMARY KEY约束用来实现实体完整性
    确保特定的列中不允许重复,且不许为NULL
    PRIMARY KEY约束定义了表的主键,它可以唯一地标识一行。
    每个表只能定义一个PRIMARY KEY约束
    可以定义在一列或多列上
    定义PRIMARY KEY约束的语法 :
[CONSTRAINT constraint_name]
PRIMARY KEY {(column_name [,…])} 

示例:
    DROP TABLE t_doctor;
    CREATE TABLE t_doctor
    (
doc_id CHAR(5) PRIMARY KEY,
doc_name CHAR(8) NOT NULL,
sex CHAR(2),
        phone VARCHAR(20)
    );

        
    * 病人表,注意:不支持注释符--

CREATE TABLE t_patient
(
    pat_id CHAR(5),
    pat_name CHAR(8) NOT NULL,
    sex CHAR(2),
    PID CHAR(18), 
    phone VARCHAR(20),
    CONSTRAINT pk_patient_id PRIMARY KEY(pat_id)
    CONSTRAINT pk_patient_id 也可以省略

4、UNIQUE约束
UNIQUE约束也用来实现实体实整性
UNIQUE约束表明同一列的任意两行都不能具有相同值。
可以插入多个NULL(与其他的DBMS不一样)
若表中已有一主键,但又想保证其他的列也是唯一的,可以定义UNIQUE约束。
一个表中可以有多个UNIQUE约束
定义UNIQUE约束的语法 :

        [CONSTRAINT constraint_name]
UNIQUE {(column_name [,…])} 

在创建表时添加UNIQUE约束 
DROP TABLE t_patient;
CREATE TABLE t_patient
(
    pat_id CHAR(5) PRIMARY KEY,
    pat_name CHAR(8) NOT NULL,
    PID CHAR(18) UNIQUE,
    /* CONSTRAINT un_PID UNIQUE(PID) */
);

5、CHECK约束
CHECK约束通过对输入到特定列的值设置检查条件,将输入数据限制为指定的值
可以在单列或多列上创建CHECK约束 
定义CHECK约束的语法 :

在创建表时,也可以为表添加CHECK约束:
    CREATE TABLE t_patient
    (
pat_id CHAR(5) PRIMARY KEY,
pat_name CHAR(8) NOT NULL,
sex CHAR(2) CHECK(sex='男' OR sex='女'),
PID CHAR(18),
phone VARCHAR(20),
CONSTRAINT ck_patient_PID CHECK(length(PID)=18 OR length(PID)=15)
    ); 

6、FOREIGN KEY约束
FOREIGN KEY约束定义了表之间的一致性关系,用于强制参照完整性。
FOREIGN KEY约束定义了对同一个表或其他表的列的引用,这些列具有PRIMARY KEY或者UNIQUE约束。 
定义FOREIGN KEY约束的语法 :

[CONSTRAINT constraint_name]
[FOREIGN KEY(column_name [,…])]
REFERENCES ref_table[(ref_column_name [,…])]
[ON DELETE {CASCADE | SET NULL|NO ACTION}]
[ON UPDATE {CASCADE | SET NULL|NO ACTION}]

DROP TABLE t_record; 
CREATE TABLE t_record
(
    pat_id CHAR(5) REFERENCES t_patient(pat_id),  #MySQL中这样写创建不上约束
    admission_date DATE,
    doc_id CHAR(5),
    diagnosis NVARCHAR(500),
    FOREIGN KEY(pat_id) REFERENCES t_patient(pat_id),
    FOREIGN KEY(doc_id) REFERENCES t_doctor(doc_id)
        )

7、级联引用完整性
[ON DELETE {CASCADE | SET NULL|NO ACTION}]
[ON UPDATE {CASCADE | SET NULL|NO ACTION}]

CASCADE使用级联,删除或更新主表数据时,同时删除从表中的数据或将从表中的数据自动更新。
SET NULL选项则在删除或更改主表数据时,自动将从表中相应数据设置为空。

NO ACTION不使用级联 


    ALTER TABLE t_record
    ADD CONSTRAINT fk_record_docid 
    FOREIGN KEY(doc_id) REFERENCES t_doctor(doc_id)
    ON DELETE CASCADE;

    ALTER TABLE t_record
    ADD CONSTRAINT fk_record_patid 
    FOREIGN KEY(pat_id) REFERENCES t_patient(pat_id)
    ON DELETE SET NULL;

        8、删除约束
ALTER TABLE table_name 
DROP PRIMARY KEY #删除主键约束
| DROP INDEX index_name #可用此句删除唯一约束
| DROP FOREIGN KEY fk_symbol #删除外键约束

NOT NULL与DEFAULT约束以修改列的方式实现
CHECK约束根本就没有保存

ALTER TABLE t_record DROP foreign key fk_record_docid;
ALTER TABLE t_record DROP foreign key fk_record_patid;

        9、查看表中的约束
Show create table t_record;


猜你喜欢

转载自blog.csdn.net/qq_35325795/article/details/80443818