PostgreSQL

PostgreSQL 知识量:10 - 51 - 182

2.4 创建数据表><

创建表的语法格式- 2.4.1 -

在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类型表示整数类型。

使用CHECK约束- 2.4.2 -

在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将检查是否满足约束条件。如果条件不满足,将引发一个错误并阻止操作。

使用非空约束- 2.4.3 -

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

使用唯一性约束- 2.4.4 -

在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替换为要应用唯一性约束的列的名称。

使用主键约束- 2.4.5 -

在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。

  • 一个表只能有一个主键约束,但可以有多个唯一约束。

使用默认约束- 2.4.6 -

在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命令来修改列的定义。

使用外键约束- 2.4.7 -

在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将引发一个错误。

  • 外键约束可以确保数据库表之间的关系保持一致性和完整性。

设置表的属性值自动增加- 2.4.8 -

在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类型创建的列会自动为主键约束生成唯一值。如果不希望将该列设置为主键,可以使用其他唯一约束来确保唯一性。