PostgreSQL 知识量:10 - 51 - 182
在PostgreSQL中,创建表的语法格式如下:
CREATE TABLE table_name ( column1 datatype1 [constraint1], column2 datatype2 [constraint2], ... );
其中,table_name是要创建的表的名称,column1, column2等是表中的列名,datatype1, datatype2等是相应的数据类型,constraint1, constraint2等是可选的约束条件。
例如,以下是一个简单的示例,创建一个名为"users"的表,包含"id"、"name"和"age"三个列:
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(50), age INT );
在这个示例中,"id"列被指定为主键,并使用SERIAL类型自动生成唯一值。"name"列使用VARCHAR(50)类型表示可变长度的字符类型,最大长度为50。"age"列使用INT类型表示整数类型。
在PostgreSQL中,CHECK约束用于限制列中的值范围。它确保列中的数据满足特定条件。CHECK约束在表定义中定义,并应用于表的列。
要使用CHECK约束,可以在创建表时在列定义之后添加CHECK子句,如下所示:
CREATE TABLE table_name ( column1 datatype1 [constraint1], column2 datatype2 [constraint2], ... CHECK (condition) );
在上述语法中,condition是一个布尔表达式,定义了应用于列的验证条件。
例如,假设有一个名为"employees"的表,其中包含"age"列。希望确保"age"列中的值介于18和60之间。为此,可以使用以下语法:
CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(50), age INT CHECK (age >= 18 AND age <= 60) );
在上述示例中,"age"列上的CHECK约束确保插入或更新的年龄值在18到60之间(包括18和60)。如果尝试插入或更新不满足条件的值,PostgreSQL将引发一个错误。
注意:CHECK约束是在插入或更新数据时进行验证的,而不是在查询时进行验证。这意味着在执行INSERT、UPDATE或DELETE语句时,PostgreSQL将检查是否满足约束条件。如果条件不满足,将引发一个错误并阻止操作。
在PostgreSQL中,非空约束(NOT NULL constraint)用于确保列中的值不能为NULL。当希望某个列在插入或更新数据时始终包含值时,可以使用非空约束。
要在创建表时应用非空约束,可以在列定义之后添加NOT NULL关键字,如下所示:
CREATE TABLE table_name ( column1 datatype1 NOT NULL, column2 datatype2, ... );
在这个语法中,table_name是要创建的表的名称,column1和datatype1分别是列的名称和数据类型,NOT NULL指示该列不能包含NULL值。
例如,如果想创建一个名为students的表,并且要求student_id和student_name列不能为空,可以使用以下SQL命令:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, student_name VARCHAR(100) NOT NULL );
在这个例子中,student_id列被定义为主键,这意味着它自动获得非空约束,并且每个值都必须是唯一的。student_name列也被显式地标记为NOT NULL,以确保在插入或更新记录时该列始终有一个值。
如果已经有一个表,并且想要为现有的列添加非空约束,可以使用ALTER TABLE命令。但是,在添加非空约束之前,需要确保该列中不包含任何NULL值,否则命令会失败。如果列中包含NULL值,需要先更新这些行以提供非空值,或者删除这些行。
以下是为现有列添加非空约束的示例:
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;
在PostgreSQL中,唯一性约束用于确保表中的一列或一组列中的值是唯一的。这意味着,在这些列中,没有两个或更多行可以有相同的值。这有助于防止重复的数据和确保数据的完整性。
要在创建表时应用唯一性约束,可以在列定义之后使用UNIQUE关键字,如下所示:
CREATE TABLE table_name ( column1 datatype1 UNIQUE, column2 datatype2, ... );
或者,如果希望在多个列上应用唯一性约束,可以使用UNIQUE (column1, column2, ...):
CREATE TABLE table_name ( column1 datatype1, column2 datatype2, ... UNIQUE (column1, column2) );
例如,如果想创建一个名为students的表,并且要求student_id列中的值是唯一的,可以使用以下SQL命令:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, student_name VARCHAR(100), UNIQUE (student_id) );
在这个例子中,student_id列被定义为自动递增的主键,并且还具有唯一性约束,这意味着每个学生的ID必须是唯一的。如果尝试插入具有重复student_id的新记录,PostgreSQL将引发一个错误。
另外,如果已经有一个表,并且想要为现有的列添加唯一性约束,可以使用ALTER TABLE命令。但在此之前,确保该列或列组合中不存在重复的值,否则添加约束会失败。如果存在重复的值,需要先删除或更新这些行。
为现有列添加唯一性约束的语法如下:
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column_name);
请将table_name替换为表的实际名称,constraint_name替换为想要的约束名称(可选),column_name替换为要应用唯一性约束的列的名称。
在PostgreSQL中,主键约束用于唯一地标识表中的每行数据。主键约束确保列中的值是唯一的,并且不能为NULL。
要在创建表时应用主键约束,可以在列定义之后使用PRIMARY KEY关键字,如下所示:
CREATE TABLE table_name ( column1 datatype1 PRIMARY KEY, column2 datatype2, ... );
或者,如果希望在多个列上应用主键约束,可以使用PRIMARY KEY (column1, column2, ...):
CREATE TABLE table_name ( column1 datatype1, column2 datatype2, ... PRIMARY KEY (column1, column2) );
例如,如果想创建一个名为students的表,并且要求student_id列作为主键,可以使用以下SQL命令:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, student_name VARCHAR(100) NOT NULL );
在这个例子中,student_id列被定义为主键,这意味着每个学生的ID必须是唯一的。由于使用了SERIAL类型,PostgreSQL会自动为student_id列生成唯一的整数值。student_name列被标记为NOT NULL,确保它始终包含一个值。
主键约束具有以下特点:
主键列中的值必须是唯一的。
主键列中的值不能为NULL。
一个表只能有一个主键约束,但可以有多个唯一约束。
在PostgreSQL中,默认约束用于为表的列设置默认值。当插入新行时,如果没有为特定列提供值,将使用默认值。
要在创建表时应用默认约束,可以在列定义之后使用DEFAULT关键字,后跟默认值的表达式,如下所示:
CREATE TABLE table_name ( column1 datatype1 DEFAULT default_value, column2 datatype2, ... );
例如,如果想创建一个名为students的表,并且要求student_age列的默认值为18,可以使用以下SQL命令:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, student_name VARCHAR(100) NOT NULL, student_age INT DEFAULT 18 );
在这个例子中,如果没有为student_age列提供值,它将默认为18。
注意:当使用默认约束时,如果列已经包含数据,则不能更改默认值。要更改默认值,需要先删除现有的数据或使用ALTER TABLE命令来修改列的定义。
在PostgreSQL中,外键约束用于确保参照完整性,即确保数据库表之间的关系始终保持有效。外键约束用于确保一个表中的数据引用另一个表中的数据。
要在创建表时应用外键约束,需要使用FOREIGN KEY子句,并在列定义之后指定引用列和被引用表的名称,如下所示:
CREATE TABLE table_name ( column1 datatype1 PRIMARY KEY, column2 datatype2, ... FOREIGN KEY (column_name) REFERENCES referenced_table(referenced_column) );
例如,如果有两个表:students和courses,并且每个学生可以注册多门课程,可能希望确保每个学生注册的课程是存在的课程。为此,可以在students表的course_id列上应用外键约束,引用courses表的course_id列,如下所示:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, student_name VARCHAR(100) NOT NULL, course_id INT, FOREIGN KEY (course_id) REFERENCES courses(course_id) );
在这个例子中,course_id列是外键列,它引用了courses表的course_id列。通过这种约束,PostgreSQL确保每个学生注册的课程是存在于courses表中的有效课程。
外键约束有几个重要的特点:
外键列中的值必须是引用表中主键或唯一约束列的值。
如果尝试插入或更新外键列中的值,而该值不存在于引用表中,PostgreSQL将引发一个错误。
外键约束可以确保数据库表之间的关系保持一致性和完整性。
在PostgreSQL中,可以使用SERIAL类型来自动增加表的属性值。SERIAL类型是一个整数列,它会自动为新插入的行生成一个唯一的值。
以下是一个示例,演示如何在表中创建一个自动增加的属性值:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, student_name VARCHAR(100) NOT NULL, student_age INT DEFAULT 18 );
在上面的示例中,student_id列被定义为SERIAL类型,这意味着每次插入新行时,PostgreSQL将自动为student_id列生成一个唯一的整数值。
向表中插入数据时,不需要手动指定student_id的值,PostgreSQL将自动为它分配一个值。例如:
INSERT INTO students (student_name, student_age) VALUES ('John Doe', 20);
在插入数据后,可以使用SELECT语句检索新插入的行,并查看自动分配的student_id值:
SELECT * FROM students;
这将返回以下结果:
student_id | student_name | student_age -----------+--------------+------------ 1 | John Doe | 20
student_id列自动分配了一个唯一的整数值。
注意:使用SERIAL类型创建的列会自动为主键约束生成唯一值。如果不希望将该列设置为主键,可以使用其他唯一约束来确保唯一性。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6