![PostgreSQL 11从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/374/27563374/b_27563374.jpg)
4.1 创建数据表
在创建完数据库之后,接下来的工作是创建数据表。所谓创建数据表,指的是在已经创建好了的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。本节将介绍创建数据表的语法形式、如何添加主键约束、外键约束、非空约束等。
4.1.1 创建数据表
数据表属于数据库,在创建数据表之前,应该先在对象浏览器中选择在哪个数据库中进行,如果没有选择数据库,则不能创建数据表。常见的创建数据表的方法有以下两种:
1. 使用对象浏览器创建数据表
【例4.1】创建数据表ppo1。具体操作步骤如下:
步骤01 在对象管理器中依次展开【mytest】➢【模式】➢【public】节点,右击【表】节点并在弹出的快捷菜单中选择【创建】➢【表】菜单命令,如图4-1所示。
步骤02 弹出【创建 - 表】对话框,默认选择【通常】选项卡,在【名称】文本框中输入“ppo1”,在【所有者】下拉列表中选择数据表的拥有者,如图4-2所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P62_6501.jpg?sign=1739311482-FG6VX8D67S40ZV5Wru9y682vOmdURhGk-0-5bb5094fe37a04be1478f779c7cda0d3)
图4-1 选择【创建】➢【表】菜单命令
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P62_6502.jpg?sign=1739311482-hQUEnZcBm5g8et0PSMfDZBCQXT2F3ydD-0-b002cb5261aed8f8f60792f9fce08959)
图4-2 【创建 - 表】对话框
步骤03 选择【列】选项卡,用户可以在这里添加数据表的字段。单击【添加】按钮,在下方可以设置字段的名称、数据类型、长度、精度等属性,这里在【名称】文本框中输入字段名称为“idnumbl”,在【数据类型】下拉列表中选择【integer】,如图4-3所示。
步骤04 采用同样的操作,可以创建数据表的多个字段,如图4-4所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P62_6522.jpg?sign=1739311482-EWDEgEBuOVbdqNvdYHc8zKqU3Thoi07K-0-f8213bb7e6cf6435a26533b2b92c9671)
图4-3 添加“idnumbl”字段
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P62_6523.jpg?sign=1739311482-GCYZOqTMX5PBrXx2XsSK7WNudDQkbIjf-0-f0fe16b26a30e9769bfe6919b38fbd4d)
图4-4 添加其他字段
步骤05 选择【约束】选项卡,用户可以创建各种约束,包括主键、外键、排他约束、唯一和检查等,默认选择【主键】选项,单击【添加】按钮,在【名称】文本框中输入“numb”,如图4-5所示。
步骤06 单击【编辑】按钮,在【通常】选项下可设置主键的名称和注释,如图4-6所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P63_6563.jpg?sign=1739311482-LV1VIhssGs884svJT69wfRdyJ3g4iOXr-0-2c7f2efdee86ef679ba1b29778bfbc7c)
图4-5 【约束】选项卡
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P63_6564.jpg?sign=1739311482-iXSWSzcAmDdqhdyHxXquWwxfVvkwtjcN-0-b726c30b67c7840b6d79939cd86dcc67)
图4-6 【通常】选项
步骤07 选择【定义】选项,可设置作为主键的字段、主键的表空间和填充因子等参数,这里在【列】下拉列表中选择【idnumbl】字段,如图4-7所示。
步骤08 选择【高级】选项卡,用户可以设置类型、填充因子等数据表的属性,如图4-8所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P63_6587.jpg?sign=1739311482-Rx1jI8WgTsdrirZisTqB9bXnLFz7wrU5-0-35905e4db70285bf92bd5c0c0ea6e4a4)
图4-7 【定义】选项
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P63_6588.jpg?sign=1739311482-E62Ia0TqoMtVFNnUkeHtSBidpNwsq1Tc-0-13d3bc741a759be236801df34247e668)
图4-8 【高级】选项卡
步骤09 选择【参数】选项卡,即可设置关于整理数据表的相关内容,如图4-9所示。
步骤10 选择【安全】选项卡,单击【添加】按钮,可以设置用户对数据表的权限,如图4-10所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P64_6622.jpg?sign=1739311482-UcAN9vljS0w3aTOm92T3DpmaBkf6hNPX-0-f5712af1298b9887c6c53d95cb1bbca5)
图4-9 【参数】选项卡
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P64_6623.jpg?sign=1739311482-RkSCmrJgkMB1mcf8bXZ2i4Su435KoAzf-0-7f408883bea50801b90c09d35483b7d6)
图4-10 【安全】选项卡
步骤11 选择【SQL】选项卡,即可看到上述操作对应的SQL语句,如图4-11所示。
步骤12 单击【保存】按钮,即可创建数据表,在对象浏览器中依次展开【表】➢【ppo1】➢【列】节点,即可在右侧的属性窗口中查看新建表中各字段的属性,如图4-12所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P64_6644.jpg?sign=1739311482-kHfiIcrr9zQp6rznUWC1mApZmK5rGaLq-0-a8b146ba1d4c253b2c3556ee316d4d17)
图4-11 【SQL】选项卡
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P64_6645.jpg?sign=1739311482-wAXMXyTF2tVsk2Xb5PrltaD6CFamCGp0-0-99a5fc6c5444931097065ca0139d89b2)
图4-12 查看字段的属性
2. 使用SQL语句创建数据表
创建数据表的语句为CREATE TABLE,语法规则如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P64_38960.jpg?sign=1739311482-6HOdEnSb5VlCEtenkoIghwVtqe1v46TQ-0-847e48d38fd2e6c8665e8b654730ecf2)
使用CREATE TABLE创建表时,必须指定以下信息:
(1)要创建的表名称,不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等。
(2)数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。
【例4.2】创建员工表tb_emp1,结构如表4.1所示。
表4.1 tb_emp1表结构
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-T65_38964.jpg?sign=1739311482-XaJL3DUZB0vJHyaJn9EpHE0L4MVPqij3-0-e6fc7857ecd6372d2c0cafc767897a6f)
在对象浏览器中选择mytest数据库,新建立一个当前连接查询,在查询编辑器中输入以下SQL语句,如图4-13所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P65_38965.jpg?sign=1739311482-CD4AVpb374hKkUVJ3eEV5mlHrLndcQ6K-0-862f3a240c0666c853a7ca4926e9cbc0)
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P65_6854.jpg?sign=1739311482-ZC6IvQxJnME09PDVSM446014ySWqPvEB-0-343f1a19c5442b59ef461c45f5a5d3b9)
图4-13 输入SQL语句
语句执行后,便创建了一个名称为tb_emp1的数据表。在对象浏览器中依次展开【mytest】➢【模式】➢【public】➢【表】➢【tb_emp1】➢【列】节点,即可在右侧的属性窗口中查看新建表的字段,如图4-14所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P66_6872.jpg?sign=1739311482-v98VCdhOltyKvL0W0aKlotqxLajLF8M8-0-73a4a7b8894007947953b3ff0f7a67cc)
图4-14 成功创建数据表
4.1.2 使用主键约束
主键又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段主键,多字段联合主键。
1. 单字段主键
主键由一个字段组成,SQL语句格式分为以下两种情况。
(1)在定义列的同时指定主键,语法规则如下:
字段名 数据类型 PRIMARY KEY
【例4.3】定义数据表tb_emp 2,其主键为id,SQL语句如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P66_38968.jpg?sign=1739311482-FPCIqXSzynwvyAJ3UrJODJXYnqbCmRL4-0-ae06bc7cabc3e23e4b9e43d07ab7ebf8)
在对象浏览器中选择新创建的数据表,在右侧的窗口中选择【依赖组件】选项卡,即可看到主键的类型,如图4-15所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P66_6934.jpg?sign=1739311482-fylzeGtZfSAd4aKjDwxor3qaoFxneLQs-0-7731710c78c1357779be8f336d228c36)
图4-15 看到主键的类型
(2)在定义完所有列之后指定主键。
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
【例4.4】定义数据表tb_emp3,其主键为id,SQL语句如下:
CREATE TABLE tb_emp3 ( id INT, name VARCHAR(25), deptId INT, salary FLOAT, PRIMARY KEY(id) );
上述两个例子执行后的结果是一样的,都会在id字段上设置主键约束。
2. 多字段联合主键
主键由多个字段联合组成,语法规则如下:
PRIMARY KEY [字段1, 字段2,…, 字段n]
【例4.5】定义数据表tb_emp4,假设表中间没有主键id,为了唯一确定一个员工,可以把name、deptId联合起来作为主键,SQL语句如下:
CREATE TABLE tb_emp4 ( name VARCHAR(25), deptId INT, salary FLOAT, PRIMARY KEY(name,deptId) );
语句执行后,便创建了一个名称为tb_emp4的数据表,name字段和deptId字段组合在一起成为tb_emp4的多字段联合主键。
4.1.3 使用外键约束
外键用来在两个表的数据之间建立链接,可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键:表中的一个字段,可以不是本表的主键,但必须对应另外一个表的主键。外键的主要作用是保证数据引用的完整性。定义外键后,不允许删除在另一个表中具有关联关系的行。例如,部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表就是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表就是从表。
使用对象浏览器创建外键的具体操作步骤如下:
步骤01 展开需要创建外键约束的数据表,右击【约束】节点,并在弹出的快捷菜单中选择【创建】➢【外键】菜单命令,如图4-16所示。
步骤02 弹出【创建-外键】对话框,默认选择【通常】选项卡,在【名称】文本框中输入外键的名称,如图4-17所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P68_7080.jpg?sign=1739311482-hWTKBNaAwLcNSVCJLNqZK3H9lvCiSSlC-0-42b63db46d9086fa5da138188cf21423)
图4-16 选择【外键】菜单命令
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P68_7081.jpg?sign=1739311482-ywU8NyqvmcI46EDZo51ASuasxrdJ4UXl-0-3d159f53bda6811ac5a3282911bba3e0)
图4-17 【创建-外键】对话框
步骤03 选择【列】选项卡,在3个参数的下拉列表中分别选择字段和表,单击【添加】按钮,即可添加外键的参考字段,如图4-18所示。
步骤04 设置完成后,单击【保存】按钮,然后在对象浏览器中刷新【约束】节点,即可看到新创建的外键约束,如图4-19所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P68_7106.jpg?sign=1739311482-MYoBd5pS1OnAj138NP8pVMr87Kbhkjwk-0-0fa16b5c36235d22f10fb4d0aae6a160)
图4-18 【列】选项卡
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P68_7107.jpg?sign=1739311482-SrhVZlQTqUqBXYHK3EN83rj0ip1ql8ib-0-abb7c84b9137ea258b6498ef55cd65f0)
图4-19 创建的外键约束
使用SQL语言可以更灵活地创建外键约束,创建外键的语法规则如下:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [ ,字段名2,…] REFERENCES <主表名> 主键列1 [ ,主键列2,…]
外键名为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示从表需要添加外键约束的字段列;主表名,即被从表外键所依赖的表的名称;主键列表示主表中定义的主键字段或者字段组合。
【例4.6】定义数据表tb_emp5,并在tb_emp5表上创建外键约束。
创建一个部门表tb_dept1,表结构如表4.2所示,SQL语句如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P69_38983.jpg?sign=1739311482-S8YfEmyMgzvmJC9IO5uFZAN1yLcEAd5X-0-5b8e9bed4f3e595e4757112570e5f8f1)
表4.2 tb_dept1表结构
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-T69_38984.jpg?sign=1739311482-I5EpEiH0I4E2SEwaDvXtljHQBrTXnmhr-0-dbfba7806d003e58cb88c078b2b8dfec)
定义数据表tb_emp5,让它的键deptId作为外键关联到tb_dept1的主键id,SQL语句为:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P69_38985.jpg?sign=1739311482-OKZCCsZz18HH7rIrHwlfLWP7NiNQ7QlQ-0-3845451f0af33d6f696d39170ff4dc6e)
以上语句执行成功之后,在表tb_emp5上添加了名称为fk_emp_dept1的外键约束,外键名称为deptId,其依赖于表tb_dept1的主键id。
提 示
关联指的是在关系型数据库中相关表之间的联系。它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,那么创建子表时就会出现错误。
4.1.4 使用非空约束
非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。
非空约束的语法规则如下:
字段名 数据类型 not null
【例4.7】定义数据表tb_emp6,指定员工的名称不能为空,SQL语句如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P70_38987.jpg?sign=1739311482-jnJcHlEh1LQkJCEqTXrmimUXHiE6mJpD-0-aa1e69cc3739aea4bb4c42bf75abc9a2)
执行后在tb_emp6中创建了一个Name字段,其插入值不能为空(NOT NULL)。
4.1.5 使用唯一性约束
唯一性约束(Unique Constraint)要求添加该约束的列字段的值唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
使用对象浏览器创造唯一性约束的具体操作步骤如下。
步骤01 展开需要创建唯一性约束的数据表,右击【约束】节点,并在弹出的快捷菜单中选择【创建】➢【唯一约束】菜单命令,如图4-20所示。
步骤02 弹出【创建 – 唯一约束】对话框,在【名称】文本框中输入唯一性约束的名称,如图4-21所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P70_7392.jpg?sign=1739311482-eNEFHrn3WFOtNaR0p9tfg9motrcimS8L-0-4909bd3359e6a306ca7c336a3cbfc162)
图4-20 选择【唯一约束】菜单命令
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P70_7393.jpg?sign=1739311482-4fbMd0TRWtZlERNggnxuPZGLFWNuWouq-0-33d428e7eae1de59bd2e016a651c3990)
图4-21 【创建−唯一约束】对话框
步骤03 选择【定义】选项卡,在【列】下拉列表中选择需要添加唯一性约束的字段,如图4-22所示。
步骤04 设置完成后,单击【保存】按钮,此时在对象浏览器中即可看到新创建的唯一约束,如图4-23所示。
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P71_7423.jpg?sign=1739311482-nlLQctBAh2KVonVgZnpdcckbIyeeqMbQ-0-68bf6391a651e48dc0d945dce55e367e)
图4-22 【定义】选项卡
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P71_7424.jpg?sign=1739311482-Wawtlmbq6HyWfFkzKsneS4wKtmkMZYsh-0-51407d62b215a8348a8d258b0b4f6098)
图4-23 新建唯一约束
使用SQL语句也可以轻松创建唯一约束,具体的语法规则如下:
(1)在定义完列之后直接指定唯一约束,语法规则如下:
字段名 数据类型 UNIQUE
【例4.8】定义数据表tb_dept2,指定部门的名称唯一,SQL语句如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P71_38996.jpg?sign=1739311482-WvnnjNTyvF7E38qduN1W70d19wRWz17c-0-03eabb0228dbdd52402196692e4b1597)
(2)在定义完所有列之后指定唯一约束,语法规则如下:
[CONSTRAINT <约束名>] UNIQUE(<字段名>)
【例4.9】定义数据表tb_dept3,指定部门的名称唯一,SQL语句如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P71_38997.jpg?sign=1739311482-LetgWs0TZFCxxCxXn80VMaZD0rBtuVwl-0-3a5dc14defeef042514cf101fd00d24c)
UNIQUE和PRIMARY KEY的区别:一个表中可以有多个字段声明为UNIQUE,但只能由一个PRIMARY KEY声明;声明为PRIMAY KEY的列不允许有空值,但是声明为UNIQUE的字段允许有空值(NULL)的存在。
4.1.6 使用默认约束
默认约束(Default Constraint)指定某列的默认值。例如,男性同学较多,性别就可以默认为‘男’。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为‘男’。
默认约束的语法规则如下:
字段名 数据类型 DEFAULT 默认值
【例4.10】定义数据表tb_emp7,指定员工的部门编号默认为1111,SQL语句如下:
![](https://epubservercos.yuewen.com/A04484/15825992904147006/epubprivate/OEBPS/Images/Figure-P72_38999.jpg?sign=1739311482-0f8dBXatY1cIfZP6ztZup3aJaH6h2hFq-0-b3691d442f874bc26a06c10aaeb041d7)
以上语句执行成功之后,表tb_emp7上的字段deptId拥有了一个默认的值1111。新插入的记录如果没有指定部门编号,则默认的都为1111。