
CREATE TABLE users (id serial PRIMARY KEY,name text,email text);CREATE TABLE rooms (id serial PRIMARY KEY,roomnumber text);
主键约束:PRIMARY KEY
主键是一行数据的唯一标识,要求非空且唯一,一张表只能有一个主键。
-- 1.添加约束
-- 1.1创建表时添加主键约束
如上面创建Users及Rooms表
-- 1.2建完表后添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
-- 2.删除约束
ALTER TABLE 表名 DROP PRIMARY KEY;
外键约束:FOREIGN KEY
CREATE TABLE reservations (user_id int references users(id),room_id int references rooms(id),Start_time timestamp,end_time timestamp,event_title text);
ALTER TABLE public.reservationsADD CONSTRAINT reservations_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id);ALTER TABLE public.reservationsADD CONSTRAINT reservations_room_id_fkey FOREIGN KEY (room_id) REFERENCES public.rooms(id);
级联和外键
使用外键约束时,应该要注意到级联更新和删除语句。
外键可以定义对链接表进行更改时对数据的影响。这些是外键约束的修饰符ON DELETE。ON UPDATE如果您因 GDPR 或其他隐私要求而需要删除用户数据,则级联删除尤其重要。
ALTER TABLE public.reservationsADD CONSTRAINT reservations_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
唯一约束:UNIQUE
ALTER TABLE ONLY public.roomsADD CONSTRAINT room_number_unique UNIQUE (roomnumber);
非空约束:NOT NULL
ALTER TABLE public.reservations ALTER COLUMN room_id SET NOT NULL;
ALTER TABLE public.reservations ALTER COLUMN start_time SET NOT NULL;ALTER TABLE public.reservations ALTER COLUMN end_time SET NOT NULL;
检查约束:CHECK
通过让数据库在插入之前检查某些内容,检查约束是向数据添加一些简单逻辑的好方法。检查约束将应用于表中的单行。
ALTER TABLE public.reservationsADD CONSTRAINT start_before_end check (start_time < end_time );
ALTER TABLE public.reservationsADD CONSTRAINT daytime_check check (start_time::time >= '08:00:00' AND end_time::time <= '17:00:00');
ALTER TABLE public.reservationsADD CONSTRAINT interval_check check (end_time - start_time >= interval '30 minutes');
查找数据库中的约束
SELECT * FROM (SELECTc.connamespace::regnamespace::text as table_schema,c.conrelid::regclass::text as table_name,con.column_name,c.conname as constraint_name,pg_get_constraintdef(c.oid)FROMpg_constraint cJOINpg_namespace ON pg_namespace.oid = c.connamespaceJOINpg_class ON c.conrelid = pg_class.oidLEFT JOINinformation_schema.constraint_column_usage con ONc.conname = con.constraint_name ANDpg_namespace.nspname = con.constraint_schemaUNION ALLSELECTtable_schema, table_name, column_name, NULL, 'NOT NULL'FROM information_schema.columnsWHEREis_nullable = 'NO') all_constraintsWHEREtable_schema NOT IN ('pg_catalog', 'information_schema')ORDER BY table_schema, table_name, column_name, constraint_name ;

文章转载自Halo Tech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




