PostgreSQL——表的基本操作

PostgreSQ表的基本操作

一、创建数据表

sql 复制代码
CREATE TABLE <表名>
(
	字段名1 数据类型 [列级别约束条件] [默认值],
	字段名2 数据类型 [列级别约束条件] [默认值],
	...
	[表级别约束条件]
);
  • 要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等
  • 数据表中如果创建多个列,每一个列(字段)的名称和数据类型都要用逗号隔开
sql 复制代码
CREATE TABLE tb_emp1
(
	id INT,
	name VARCHAR(25),
	deptId INT,
	salary FLOAT
);

1.1、主键约束

1.1.1、单字段主键

主键由一个字段组成,SQL语句分为以下两种情况:

1. 在定义列的同时指定主键:

sql 复制代码
字段名 数据类型 PRIMARY KEY
sql 复制代码
CREATE TABLE tb_emp2
(
	id INT PRIMARY KEY,
	name VARCHAR(25),
	deptId INT,
	salary FLOAT
);

2. 在定义完所有列之后指定主键:

sql 复制代码
[CONSTRAINT <约束名>] PRIMARY KEY 字段名
sql 复制代码
CREATE TABLE tb_emp3
(
	id INT,
	name VARCHAR(25),
	deptId INT,
	salary FLOAT,
	PRIMARY KEY(id)
);

1.1.2、多字段联合主键

sql 复制代码
PRIMARY KEY [字段1, 字段2, ..., 字段n]
sql 复制代码
CREATE TABLE tb_emp4
(
	name VARCHAR(25),
	deptId INT,
	salary FLOAT,
	PRIMARY KEY(name, deptId)
);

1.2、外键约束

外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键必须等于另一个表中主键的某个值。

sql 复制代码
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [ , 字段名2, ...] REFERENCES <主表名> 主键列1 [ , 主键列2, ...]

定义数据表tb_emp5,并在tb_emp5表上创建外键约束,关联到tb_dept1的主键id。

sql 复制代码
CREATE TABLE tb_dept1
(
	id INT PRIMARY KEY,
	name VARCHAR(22) NOT NULL,
	location VARCHAR(50)
);

CREATE TABLE tb_emp5
(
	id INT PRIMARY KEY,
	name VARCHAR(25),
	deptId INT,
	salary FLOAT,
	CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);


1.3、非空约束

非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时,没有指定值,数据库系统会报错。

sql 复制代码
字段名 数据类型 NOT NULL
sql 复制代码
CREATE TABLE tb_emp6
(
	id INT PRIMARY KEY,
	name VARCHAR(25) NOT NULL,
	deptId INT,
	salary FLOAT,
	CONSTRAINT fk_emp_dept2 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);

1.4、唯一性约束

唯一性约束(Unique Constraint)要求添加该约束的列字段的值唯一,允许为空,但只能出现一个空值。唯一性约束可以确保一列或者几列不出现重复值。

1. 在定义完列之后指定指定唯一约束:

sql 复制代码
字段名 数据类型 UNIQUE
sql 复制代码
CREATE TABLE tb_dept2
(
	id INT PRIMARY KEY,
	name VARCHAR(22) UNIQUE,
	location VARCHAR(50)
);

2. 在定义完所有列之后指定唯一约束:

sql 复制代码
[CONSTRAINT <约束名>] UNIQUE (<字段名>)
sql 复制代码
CREATE TABLE tb_dept3
(
	id INT PRIMARY KEY,
	name VARCHAR(22),
	location VARCHAR(50),
	CONSTRAINT STH UNIQUE(name)
);

1.5、默认约束

默认约束(Default Constraint)指定某列的默认值。

sql 复制代码
字段名 数据类型 DEFAULT 默认值
sql 复制代码
CREATE TABLE tb_emp7
(
	id INT PRIMARY KEY,
	name VARCHAR(22) NOT NULL,
	deptId INT DEFAULT 1111,
	salary FLOAT,
	CONSTRAINT fk_emp_dept3 FOREIGN KEY (deptId) REFERENCES tb_dept1(id)
);

2、修改数据表

2.1、修改表名

sql 复制代码
ALTER TABLE <旧表名> RENAME TO <新表名>;
sql 复制代码
-- 将tb_dept3改名为tb_department3
ALTER TABLE tb_dept3 RENAME TO tb_department3;

2.2、修改字段的数据类型

sql 复制代码
ALTER TABLE <表名> ALTER COLUMN <字段名> TYPE <数据类型>
sql 复制代码
-- 将tb_dept1中name字段的数据类型由VARCHAR(22)修改成CARCHAR(30)
ALTER TABLE tb_dept1 ALTER COLUMN name TYPE VARCHAR(30);

2.3、修改字段名

sql 复制代码
ALTER TABLE <表名> RENAME <旧字段名> TO <新字段名> <新数据类型>;
sql 复制代码
-- 将tb_dept1中的location改名为loc,数据类型不变
ALTER TABLE tb_dept1 RENAME location TO loc;

2.4、添加字段

一般情况下,一个完整字段包括字段名、数据类型、完整性约束,语法如下:

sql 复制代码
ALTER TABLE <表名> ADD COLUMN <新字段名> <数据类型>

1. 添加无完整性约束的条件的字段:

sql 复制代码
-- 在tb_dept1中添加一个没有完整性约束的INT类型的managerId
ALTER TABLE tb_dept1 ADD COLUMN managerId INT;

2. 添加有完整性约束条件的字段:

sql 复制代码
-- 在tb_dept1中添加一个不为空的VARCHAR(12)类型的column1
ALTER TABLE tb_dept1 ADD COLUMN column1 VARCHAR(12) NOT NULL;

2.5、删除字段

sql 复制代码
ALTER TABLE <表名> DROP <字段名>;
sql 复制代码
-- 删除tb_dept1中的column2字段
ALTER TABLE tb_dept1 DROP column2;

2.6、删除表的外键约束

sql 复制代码
ALTER TABLE <表名> DROP CONSTRAINT <外键约束名>
sql 复制代码
-- 删除数据表tb_emp9中外键约束
CREATE TABLE tb_emp9
(
	id INT PRIMARY KEY,
	name VARCHAR(25),
	deptId INT,
	salary FLOAT,
	CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1(id)
);

ALTER TABLE tb_emp9 DROP CONSTRAINT fk_emp_dept;

3、删除数据表

3.1、删除没有被关联的表

sql 复制代码
DROP TABLE [IF EXISTS] 表1, 表2, ..., 表n;
sql 复制代码
-- 删除数据表tb_dept2
DROP TABLE IF EXISTS tb_dept2;

3.2、删除被其他表关联的主表

数据表之间存在外键关联的情况,如果直接删除父表,结果会显示失败,原因是直接删除将破坏表的参照完整性。如果必须要删除,可以先删除与之关联的子表,再删除父表。但是这样同时删除了两个表中的数据。有的情况下可能要保留子表,这时要单独删除父表,只需将关联的表的外键约束条件取消,然后就可以删除父表:

sql 复制代码
-- 父表
CREATE TABLE tb_dept2
(
	id INT PRIMARY KEY,
	name VARCHAR(22),
	location VARCHAR(50)
);

-- 子表
CREATE TABLE tb_emp
(
	id INT PRIMARY KEY,
	name VARCHAR(25),
	deptId INT,
	salary FLOAT,
	CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept2(id)
);

-- 直接删除,会报错
DROP TABLE tb_dept2;

-- 接触外键约束再删除
ALTER TABLE tb_emp DROP CONSTRAINT fk_emp_dept;
DROP TABLE tb_dept2;
相关推荐
山茶花开时。1 分钟前
[Oracle] NVL()函数
数据库·oracle
水木石画室3 分钟前
Redis的分布式序列号生成器原理
数据库·redis·分布式
❀͜͡傀儡师26 分钟前
达梦数据库日常运维命令
运维·数据库
喵王叭38 分钟前
【大模型实战】向量数据库实战 - Chroma & Milvus
数据库·人工智能·langchain
云台0951 小时前
HIVE 窗口函数处理重复数据
数据库
得物技术2 小时前
Valkey 单点性能比肩 Redis 集群了?Valkey8.0 新特性分析|得物技术
大数据·数据库·redis
倾听醉梦语2 小时前
Redis作为MySQL缓存的完整指南:从原理到实战
数据库·redis·mysql·缓存
秋难降4 小时前
零基础学习SQL(二)-------关系型数据库数据操纵语言(DML)
大数据·数据库·mysql
月夜奇术师4 小时前
视图 vs 直接使用复杂SQL:深入比较
数据库·sql