創建表
語法:
create table table_name ( column_name type column_constraint, table_constraint table_constraint ) inherits existing_table_name;
示例:
create table account( user_id serial primary key, username varchar(50) unique not null, password varchar(50) not null );
主鍵約束
主鍵是用於在表中唯一標識行的列或列組。從技術上講,主鍵約束是非空約束和UNIQUE約束的組合。
1.使用列級約束設置主鍵
create table "SysUser"( "UserId" serial primary key, "UserName" varchar(50), "Pwd" varchar(50) ); --說明:只能設置一列作為主鍵,主鍵默認名稱為tablename_pkey。
2.使用表級約束設置主鍵
create table "SysUser"( "UserId" serial, "UserName" varchar(50), "Pwd" varchar(50), constraint PK_SysUser primary key("UserId") ); --說明:使用[表]級約束設置主鍵,可以設置一列或多列作為主鍵,主鍵默認名稱為tablename_pkey,constraint PK_SysUser可省略。
3.通過修改表結構設置主鍵
--語法:alter table table_name add [constraint constraint_name] primary key(column_1, column_2); create table "SysUser"( "UserId" serial, "UserName" varchar(50), "Pwd" varchar(50) ); alter table "SysUser" add constraint PK_SysUser primary key("UserId"); --說明:通過修改表結構設置主鍵,可以設置一列或多列作為主鍵,可以指定主鍵名稱。
4.往已有表添加自增主鍵
--創建沒有任何主鍵的表。 create table "Vendors" ("Name" varchar(255)); --往表添加數據 insert into "Vendors"("Name")values('001'),('002'),('003'),('004'); --查詢 select * from "Vendors";
數據輸出
現在,如果我們要添加一個名為id的自增主鍵到vendors表。
alter table "Vendors" add column "ID" serial primary key;
數據輸出
5.刪除主鍵
alter table table_name drop constraint pk_name;
外鍵約束
外鍵約束維護子表和父表之間的引用完整性。
1.使用列級約束設置外鍵
create table "SysUserInfo"( "UserId" integer primary key references "SysUser"("UserId"), "RealName" varchar(50), "IdCard" varchar(50), "Gender" smallint ); --說明:外鍵默認名稱為tablename_columnname_fkey
2.使用表級約束設置外鍵
create table "SysUserInfo"( "UserId" integer, "RealName" varchar(50), "IdCard" varchar(50), "Gender" smallint, primary key("UserId"), foreign key("UserId") references "SysUser"("UserId") ); --說明:外鍵默認名稱為tablename_columnname_fkey
3.通過修改表結構設置外鍵
--語法:alter table table_name add [constraint constraint_name] foreign key(column_1) references TableName(ColumnName); create table "SysUserInfo"( "UserId" integer, "RealName" varchar(50), "IdCard" varchar(50), "Gender" smallint, primary key("UserId") ); alter table "SysUserInfo" add constraint SysUserInfo_UserId_fkey foreign key("UserId") references "SysUser"("UserId"); --說明:通過修改表結構設置外鍵,可以指定外鍵名稱。
4.刪除外鍵約束(同刪除其他約束一樣,使用同一語法)
alter table table_name drop constraint fk_name;
唯一約束
確保[列]或[列組]中的值在表中是唯一的。
1.使用列級約束設置唯一約束
create table "Ha" ( "h1" varchar(50) unique, "h2" varchar(50) unique, "h3" varchar(50) ); --生成2個列的唯一約束Ha_h1_key 和 Ha_h2_key
2.使用表級約束設置唯一約束(注意以下兩種方式的區別)
create table "Ha" ( "h1" varchar(50), "h2" varchar(50), "h3" varchar(50), unique("h1","h2") ); --將會生成1個列組的唯一約束Ha_h1_h2_key create table "Ha" ( "h1" varchar(50), "h2" varchar(50), "h3" varchar(50), unique("h1"), unique("h2") ); --將會生成2個列的唯一約束Ha_h1_key和Ha_h2_key
3.通過修改表結構設置唯一約束
create table "Ha" ( "h1" varchar(50), "h2" varchar(50), "h3" varchar(50) ); alter table "Ha" add constraint Ha_h1_h2_key unique("h1","h2") --說明:將會生成1個列組的唯一約束Ha_h1_h2_key。如果想要2個列的唯一約束,需寫兩個alter table。
4.測試列唯一約束和列組唯一約束
列唯一約束
--首先創建一個具有唯一約束(列唯一約束)的表 create table "Ha" ( "h1" varchar(50) unique ); insert into "Ha"("h1")values('0'); --success insert into "Ha"("h1")values('0'); --error:重復鍵違反唯一約束"Ha_h1_key",鍵值"(h1)=(0)" 已經存在。 insert into "Ha"("h1")values(null);--success:可理解為null不等於任何一個值,因為它本身就是不確定的值,所以該條數據能添加成功。 insert into "Ha"("h1")values(null);--success:該條數據也能添加成功。
列組唯一約束
--刪除原表,然后創建一個具有唯一約束(列組唯一約束)的表 create table "Ha" ( "h1" varchar(50), "h2" varchar(50), unique("h1","h2") ); insert into "Ha"("h1","h2")values('0','0');--success insert into "Ha"("h1","h2")values('0','1');--success insert into "Ha"("h1","h2")values('0','1');--error:重復鍵違反唯一約束"Ha_h1_h2_key",鍵值"(h1, h2)=(0, 1)" 已經存在。 insert into "Ha"("h1","h2")values(null,null);--success insert into "Ha"("h1","h2")values(null,null);--success
檢查約束
該約束基於布爾表達式約束表中列的值。
1.使用列級約束設置檢查約束
create table "Ha" (income numeric CHECK(salary > 0));
2.使用表級約束設置檢查約束
create table "Ha" ( salary numeric, CHECK(salary > 0) );
3.通過修改表結構設置檢查約束
create table "Ha" ( salary numeric ); alter table "Ha" add constraint Ha_salary_check check(salary > 0);