思考题:
现在又一张国家表,里面只有一个国家名称的字段,内容如下:“中国、美国、巴西、荷兰”,
现在要求通过查询实现对战功能:
中国--美国
中国--巴西
中国--荷兰
美国--中国
美国--巴西
美国--荷兰
问:该程序如何实现?
分析:本程序只能使用笛卡尔积完成。
CREATE TABLE national(
name VARCHAR2(30)
);
--增加测试数据
INSERT INTO national(name) values ('中国') ;
INSERT INTO national(name) values ('美国') ;
INSERT INTO national(name) values ('巴西') ;
INSERT INTO national(name) values ('荷兰') ;
查询时肯定是表自己关联自己
SELECT t1.name,t2.name
FROM national t1,national t2
WHERE t1.name<>t2.name;
约束(重点)
在数据库表的开发中,约束是必不可少的支持,使用约束可以更好
的保证数据库中数据的完整性。
约束的分类:
在实际中,约束主要分为以下五种约束:
主键约束:主键表示是一个唯一的标识,本身不能为空
eg 身份证编号是唯一的,不可重复的,不可为空
唯一约束:在一个表中只允许建立一个主键约束,而其他列如果
不希望出现重复值的话,则就可以使用唯一约束。
检查约束:检查一个列的内容是否合法
eg:年龄,只能在0~150间
eg:性别,只能是男、女,中性
非空约束:姓名字段的内容不能为空
外键约束:在两张表中进行约束操作。
主键约束(PRIMARY KEY)
主键约束一般都在id上使用,而且本身已经默认了内容不能为空。
主键约束可以在建立表的时候指定:
eg:建立person表,在pid上增加主键约束。
CREATE TABLE person(
pid VARCHAR2(18) PRIMARY KEY ,
name VARCHAR2(200) ,
age NUMBER(3) ,
birthday DATE ,
sex VARCHAR2(2) DEFAULT '男'
);
或者
CREATE TABLE person(
pid VARCHAR2(18) PRIMARY KEY ,
name VARCHAR2(200) ,
age NUMBER(3) ,
birthday DATE ,
sex VARCHAR2(2) DEFAULT '男' ,
CONSTRAINT person_pid_pk PRIMARY KEY(pid) //可指定约束名称
) ;
非空约束(NOT NULL)
使用非空约束,表示一个字段的内容不允许为空,即:插入数据的时候
必须插入内容
DROP TABLE person ;
CREATE TABLE person
(
pid VARCHAR2(18),
name VARCHAR2(200) NOT NULL,
age NUMBER(3) NOT NULL,
birthday DATE ,
sex VARCHAR2(2) DEFAULT '男',
CONTRAINT person_pid_pk PRIMARY KEY(pid)
) ;
它再错误提示中,可以发现,已经明确的指明了错误所发生的字段名称。
ORA-01400:无法将NUll插入("SCOTT","PERSON","NAME")
ORA-01400:无法将NULL插入("SCOTT","PERSON","AGE")
唯一约束(UNIQUE)
表示一个字段中的内容时唯一的,其他列不允许重复。
假设:现在姓名中不允许出现重名的情况。
CREATE TABLE person
(
pid VARCHAR2(18)
name VARCHAR2(200) UNIQUE NOT NULL ,
age NUMBER(3) NOT NULL ,
birthday DATE ,
sex VARCHAR2(2) DEFAULT '男' ,
CONSTRAINT person_pid_pk PRIMARY KEY(pid)
) ;
eg:向表中插入数据,数据插入两条
INSERT INTO person() VALUES
('',NULL,30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女');
以创建1行
INSERT INTO person() VALUES
('',NULL,30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女');
第1行出现错误:
ORA-00001:违反唯一的约束条件(SCOTT.SYS_C005282)
第一条数据正常插入,第二条数据,名字违反了唯一约束条件,
所以出现了以下的错误信息。
ORA-00001:违反唯一的约束条件(SCOTT.SYS_C005282)
此错误信息,也是使用自动的约束名称编号,所以要想
指定约束的名称,也可以使用
CREATE TABLE person
(
pid VARCHAR2(18)
name VARCHAR2(200) NOT NULL ,
age NUMBER(3) NOT NULL ,
birthday DATE ,
sex VARCHAR2(2) DEFAULT '男' ,
CONSTRAINT person_pid_pk PRIMARY KEY(pid),
CONSTRAINT person_name_uk UNIQUED(name)
) ;
错误信息上已经明确的显示出了自己定义的约束名称
检查约束(CHECK)
使用检查约束来判断一个列中插入的内容是否合法,
例如:年龄的取值范围、性别的取值范围。
CREATE TABLE person
(
pid VARCHAR2(18) ,
name VARCHAR2(200) NOT NULL ,
age NUMBER(3) NOT NULL CHECK(age BETWEEN 0 AND 150)
birthday DATE ,
sex VARCHAR2(2) DEFAULT '男' CHECK(sex IN('男','女','中性')),
CONSTRAINT person_pid_pk PRIMARY KEY(pid) ,
CONSTRAINT person_name_uk UNIQUE(name)
) ;
eg:插入错误的年龄
INSERT INTO person (pid,name,age,birthday,sex) VALUES
('111111111111111111','张三',300,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ;
第1行出现错误:
ORA-02290:违反检查约束条件(SCOTT.SYS_C005289)
错误信息:
第1行出现错误:
ORA-02290:违反检查约束条件(SCOTT.SYS_C005289)
eg:插入正确的性别
INSERT INTO person(pid,name,age,birthday,sex) VALUES
('111111111111111111','张三',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'无') ;
错误信息:
ORA-02290:违反检查约束条件(SCOTTSYS_C005290)
以上的两条错误信息中所有约束错误都是采用自动命名的形式,那么在CHECK
CREATE TABLE person
(
pid varchar2(18)
name varchar2(200) NOT NULL ,
age number(3) NOT NULL ,
birthday DATE ,
sex varchar2(2) DEFAU