[GBase 8s 教程]GBase 8s 约束
GBase 8s 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
约束确保了数据库中数据的准确性和可靠性。
约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。
以下是在 GBase 8s 中常用的约束。
- NOT NULL:指示某列不能存储 NULL 值。
- UNIQUE:确保某列的值都是唯一的。
- PRIMARY Key:NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN Key(REFERENCES):保证表中某列或者某些列的数据匹配另一个表或者同一表的其它列或者某些列的值的参照完整性。
- CHECK: 保证列中的值符合指定的条件。
NOT NULL 约束
默认情况下,列可以保存为 NULL 值。如果您不想某列有 NULL 值,那么需要在该列上定义此约束,指定在该列上不允许 NULL 值。
NULL 与没有数据是不一样的,它代表着未知的数据。
实例
下面实例创建了一张表叫 COMPANY,添加了 6 个字段,其中两个NAME,AGE 设置不接受空置:
DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY DECIMAL(10,2),
JOIN_DATE DATE DEFAULT TODAY
);
UNIQUE 约束
UNIQUE 约束可以设置列是唯一的,避免同一列出现重复值。
实例
下面实例创建了一张表叫 COMPANY,添加了 6 个字段,其中 NAME 设置为 UNIQUE,因此你不能添加两条有相同名字的记录:
DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY DECIMAL(10,2),
JOIN_DATE DATE DEFAULT TODAY
);
PRIMARY KEY
在设计数据库时,PRIMARY KEY 非常重要。
PRIMARY KEY 称为主键,是数据表中每一条记录的唯一标识。
设置 UNIQUE 的列可能有多个,但是一张表只有一列可以设置 PRIMARY KEY。
我们可以使用主键来引用表中的行,也可以通过把主键设置为其他表的外键,来创建表之间的关系。
主键是非空约束和唯一约束的组合。
一个表只能有一个主键,它可以由一个或多个字段组成,当多个字段作为主键,它们被称为复合键。
如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值。
实例
下面我们创建 COMAPNY表,其中 ID 作为主键:
DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY DECIMAL(10,2),
JOIN_DATE DATE DEFAULT TODAY
);
FOREIGN KEY 约束
FOREIGN KEY 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行 或者 同一个表的其它列中的某一行 中出现的值。
通常一个表中的 FOREIGN KEY 指向另一个表中的 的PRIMARY KEY(主键) 或者 UNIQUE KEY(唯一约束的键),即维护了两个相关表之间的引用完整性。
实例
下面实例创建了一张表叫 COMPANY,添加了 6 个字段:
DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY DECIMAL(10,2),
JOIN_DATE DATE DEFAULT TODAY
);
下面实例创建一张 DEPARTMENT 表,并添加 3 个字段,EMP_ID 就是外键,参照 COMPANY 的 ID:
DROP TABLE IF EXISTS DEPARTMENT;
CREATE TABLE DEPARTMENT (
ID SERIAL PRIMARY KEY,
DEPT CHAR(50) NOT NULL,
EMP_ID INT references COMPANY(ID)
);
下面实例创建一张EMPLOYESS 表,并添加 2 个字段,EMP_NUM 是主键, MGR_NUM 参考EMP_NUM:
DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
emp_num INTEGER PRIMARY KEY,
mgr_num INTEGER REFERENCES employee (emp_num)
);
CHECK 约束
CHECK 约束保证列中的所有值满足某一条件,即对输入一条记录要进行检查。如果条件值为 false,则记录违反了约束,且不能输入到表。
实例
下面实例创建了一张表叫 COMPANY,添加了 6 个字段,在这里,我们为 SALARY 列添加 CHECK,所以工资不能必须大于2000 (最低工资标准):
DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY DECIMAL(10,2) CHECK(SALARY>2000),
JOIN_DATE DATE DEFAULT TODAY
);
删除约束
删除约束必须知道约束名称,已经知道名称来删除约束很简单,如果不知道名称,则需要找到系统生成的名称。
获取约束名称的语句,例如:获取COMPANY表上所有的约束
SELECT constrname, constrtype
FROM sysconstraints c, systables t
WHERE c.tabid = t.tabid
AND t.tabname = 'company';
输出的结果中,constrtype中P(Primary key), U(Unique), N(NOT NULL), C(Check), R(REFERENCES)
constrname u246_172
constrtype P
constrname u246_173
constrtype U
constrname n246_174
constrtype N
constrname n246_175
constrtype N
constrname n246_176
constrtype N
constrname c246_177
constrtype C
删除约束的通用语法如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;