pg學習 基本表定義 約束關係

2021-07-29 21:27:39 字數 4391 閱讀 7189

約束關係

1、非空約束

highgo=# create table test1(

highgo(# num int unique,

highgo(# name varchar(10)

highgo(# );

注意: create table / unique 將要為表 "test1" 建立隱含索引 "test1_num_key"

create table

插入兩條合法記錄

highgo=# insert into test1 values(1,'adam');

insert 0 1

highgo=# insert into test1 values(2,'eva');

insert 0 1

highgo=# select * from test1;

num | name

-----+------

1 | adam

2 | eva

(2 rows)

插入一條非法記錄,違反了非空約束

highgo=# insert into test(no) values(002);

錯誤: 在字段 "name" 中空值違反了非空約束

detail: 失敗, 行包含(2, null).

2、唯一約束

highgo=# create table test1(

highgo(# num int unique,

highgo(# name varchar(10)

highgo(# );

注意: create table / unique 將要為表 "test1" 建立隱含索引 "test1_num_key"

create table

插入合法記錄

highgo=# insert into test1 values(1,'adam');

insert 0 1

highgo=# insert into test1 values(2,'eva');

insert 0 1

highgo=# select * from test1;

num | name

-----+------

1 | adam

2 | eva

(2 rows)

插入非法記錄

highgo=# insert into test1 values(2,'lilith');

錯誤: 重複鍵違反唯一約束"test1_num_key"

detail: 鍵值"(num)=(2)" 已經存在

注意:如果該唯一值欄位,插入空值的時候,可以插入多條記錄

highgo=# insert into test1(name) values('sachiel');

insert 0 1

highgo=# insert into test1(name) values('shamshiel');

insert 0 1

highgo=# select * from test1;

num | name

-----+-----------

1 | adam

2 | eva

| sachiel

| shamshiel

(4 rows)

3、主鍵約束

主鍵約束相當於非空約束和唯一約束的組合。這種約束不僅能保證字段只能取非空值, 而且保證欄位的值在表中唯一。

highgo=# create table test3(

highgo(# num int primary key,

highgo(# name varchar(10)

highgo(# );

注意: create table / primary key 將要為表 "test3" 建立隱含索引 "test3_pkey"

create table

4、外來鍵約束

外來鍵約束主要用於保證資料庫的參照完整性。

highgo=# create table test4(

highgo(# snum int references test3,

highgo(# score int);

create table

highgo=# insert into test4 values(3,88);

錯誤: 插入或更新表 "test4" 違反外來鍵約束 "test4_snum_fkey"

detail: 鍵值對(snum)=(3)沒有在表"test3"中出現.

highgo=# insert into test4 values(2,88);

insert 0 1

注意:on update cascade (父表修改,子表也修改)

on delete cascade (父表刪除,子表也刪除)

on delete set null (父表刪除,子表設定為 null)

highgo=# create table test5(

highgo(# snum int references test3

highgo(# on update cascade

highgo(# on delete set null,score int);

create table

highgo=# insert into test5 values(1,99);

insert 0 1

highgo=# insert into test5 values(2,88);

insert 0 1

highgo=# select * from test5;

snum | score

------+-------

1 | 99

2 | 88

(2 rows)

highgo=# update test3 set num=8 where name='lilith';

錯誤: 在 "test3" 上的更新或刪除操作違反了在 "test4" 上的外來鍵約束 "test4_snum_fkey"

detail: 鍵值對(num)=(2)仍然是從表"test4"引用的.

highgo=# insert into test3 values(3,'sachiel');

insert 0 1

highgo=# update test3 set num=8 where name='sachiel';

update 1

highgo=# select * from test3;

num | name

-----+---------

1 | adam

2 | lilith

8 | sachiel

(3 rows)

highgo=# update test3 set num=4 where name='adam';

update 1

highgo=# select * from test3;

num | name

-----+---------

2 | lilith

8 | sachiel

4 | adam

(3 rows)

highgo=# delete from test3 where num=4;

delete 1

highgo=# select * from test5;

snum | score

------+-------

2 | 88

| 99

(2 rows)

5、資料檢驗

highgo=# create table test6

highgo-# (num int,name varchar(10),*** varchar(1) check(*** in('y','n')));

create table

highgo=# insert into test6 values(1,'aaa','y');

insert 0 1

highgo=# insert into test6 values(2,'bbb','n');

insert 0 1

highgo=# select * from test6;

num | name | ***

-----+------+-----

1 | aaa | y

2 | bbb | n

(2 rows)

highgo=# insert into test6 values(2,'bbb','a');

錯誤: 關係 "test6" 的新列違反了檢查約束 "test6_***_check"

detail: 失敗, 行包含(2, bbb, a).

pg學習 基本表定義 修改表結構

修改表結構 1 增加字段 highgo d test1 table public.test1 column type modifiers id integer name character varying highgo alter table test1 add addr varchar 20 al...

pg學習 基本表定義 資料型別

資料型別 1 字串型別 char 型別 描述單個位元組的字段。char length 型別 存放定長的字元到字串中,不足 length 的字串,用空格進行 補充。varchar length 型別 存放變長的字串,但有長度限制 text 型別 不限制字串的數目,通常用於描述長度變化較大或長度不可預知...

建立表 定義約束

建立表 use bhgs 確保sql server是在指定資料庫中建立物件 goif object id dbo.employee u is null drop table dbo.employee create table dbo.employee empid int notnull firstn...