PostgreSQL創建表及約束


創建表

  語法:

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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM