SQL创建和操纵表

news2025/1/2 23:31:52

本文介绍创建、更改和删除表的基本知识。

1. 创建表

SQL 不仅用于表数据操纵,而且还用来执行数据库和表的所有操作,包括表本身的创建和处理。一般有两种创建表的方法:

  1. 多数DBMS 都具有交互式创建和管理数据库表的工具;
  2. 表也可以直接用SQL 语句操纵。

用程序创建表,可以使用SQL 的 CREATE TABLE 语句。需要注意的是,使用交互式工具时实际上就是使用SQL 语句。这些语句不是用户编写的,界面工具会自动生成并执行相应的SQL 语句(更改已有的表时也是这样)。

注意:语法差别
在不同的SQL 实现中,CREATE TABLE 语句的语法可能有所不同。对于具体的DBMS 支持何种语法,请参阅相应的文档。

本文不会介绍创建表时可以使用的所有选项,那超出了本文的范围,我只给出一些基本选项。详细的信息说明,请参阅具体的DBMS 文档。

1.1 表创建基础

利用 CREATE TABLE 创建表,必须给出下列信息:

  1. 新表的名字,在关键字 CREATE TABLE 之后给出;
  2. 表列的名字和定义,用逗号分隔;
  3. 有的DBMS 还要求指定表的位置。

下面的SQL 语句创建本书中所用的 Products 表:

CREATE TABLE Products
(
  prod_id CHAR(10) NOT NULL,
  vend_id CHAR(10) NOT NULL,
  prod_name CHAR(254) NOT NULL,
  prod_price DECIMAL(8,2) NOT NULL,
  prod_desc VARCHAR(1000) NULL
);

分析
从上面的例子可以看到,表名紧跟 CREATE TABLE 关键字。实际的表定义(所有列)括在圆括号之中,各列之间用逗号分隔。这个表由5列组成。每列的定义以列名(它在表中必须是唯一的)开始,后跟列的数据类型。整条语句以圆括号后的分号结束。

前面提到,不同DBMS 的 CREATE TABLE 语法有所不同,这个简单脚本也说明了这一点。这条语句在绝大多数DBMS 中有效,但对于DB2,必须从最后一列中去掉 NULL

提示:语句格式化
回想一下在SQL 语句中忽略的空格。语句可以在一个长行上输入,也可以分成许多行,它们没有差别。这样,你就可以用最适合自己的方式安排语句的格式。前面的 CREATE TABLE 语句就是SQL 语句格式化的一个好例子,代码安排在多个行上,列定义进行了恰当的缩进,更易阅读和编辑。以何种格式安排SQL 语句并没有规定,但我强烈推荐采用某种缩进格式。

提示:替换现有的表
在创建新的表时,指定的表名必须不存在,否则会出错。防止意外覆盖已有的表,SQL 要求首先手工删除该表(请参阅后面的内容),然后再重建它,而不是简单地用创建表语句覆盖它。

1.2 使用NULL值

NULL 值就是没有值或缺值。允许 NULL 值的列也允许在插入行时不给出该列的值。不允许 NULL 值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。

每个表列要么是 NULL 列,要么是 NOT NULL 列,这种状态在创建时由表的定义规定。请看下面的例子:

CREATE TABLE Orders
(
  order_num INTEGER NOT NULL,
  order_date DATETIME NOT NULL,
  cust_id CHAR(10) NOT NULL
);

分析
这条语句创建本书中所用的 Orders 表。Orders 包含三列:订单号、订单日期和顾客ID。这三列都需要,因此每一列的定义都含有关键字 NOT NULL。这就会阻止插入没有值的列。如果插入没有值的列,将返回错误,且插入失败。

下一个例子将创建混合了 NULLNOT NULL 列的表:

CREATE TABLE Vendors
(
  vend_id CHAR(10) NOT NULL,
  vend_name CHAR(50) NOT NULL,
  vend_address CHAR(50),
  vend_city CHAR(50),
  vend_state CHAR(5),
  vend_zip CHAR(10),
  vend_country CHAR(50)
);

分析
这条语句创建 Vendors 表。供应商ID 和供应商名字列是必需的,因此指定为 NOT NULL。其余五列全都允许 NULL 值,所以不指定 NOT NULLNULL 为默认设置,如果不指定 NOT NULL,就认为指定的是 NULL

注意:指定NULL
在不指定 NOT NULL 时,多数DBMS 认为指定的是 NULL,但不是所有的DBMS 都这样。某些DBMS 要求指定关键字 NULL,如果不指定将出错。关于完整的语法信息,请参阅具体的DBMS 文档。

提示:主键和NULL值
主键是其值唯一标识表中每一行的列。只有不允许 NULL 值的列可作为主键,允许 NULL 值的列不能作为唯一标识。

注意:理解NULL
不要把 NULL 值与空字符串相混淆。NULL 值是没有值,不是空字符串。如果指定 ''(两个单引号,其间没有字符),这在 NOT NULL 列中是允许的。空字符串是一个有效的值,它不是无值。NULL 值用关键字 NULL 而不是空字符串指定。

1.3 指定默认值

SQL 允许指定默认值,在插入行时如果不给出值,DBMS 将自动采用默认值。默认值在 CREATE TABLE 语句的列定义中用关键字 DEFAULT 指定。

请看下面的例子:

CREATE TABLE OrderItems
(
  order_num INTEGER NOT NULL,
  order_item INTEGER NOT NULL,
  prod_id CHAR(10) NOT NULL,
  quantity INTEGER NOT NULL DEFAULT 1,
  item_price DECIMAL(8,2) NOT NULL
);

分析
这条语句创建 OrderItems 表,包含构成订单的各项(订单本身存储在 Orders 表中)。quantity 列为订单中每个物品的数量。在这个例子中,这一列的描述增加了 DEFAULT 1,指示DBMS,如果不给出数量则使用数量 1

默认值经常用于日期或时间戳列。例如,通过指定引用系统日期的函数或变量,将系统日期用作默认日期。MySQL 用户指定 DEFAULT CURRENT_DATE(),Oracle 用户指定 DEFAULT SYSDATE,而SQL Server 用户指定 DEFAULT GETDATE()。遗憾的是,这条获得系统日期的命令在不同的DBMS 中大多是不同的。表17-1 列出了这条命令在某些DBMS 中的语法。


提示:使用DEFAULT 而不是NULL值
许多数据库开发人员喜欢使用 DEFAULT 值而不是 NULL 列,对于用于计算或数据分组的列更是如此。

2. 更新表

更新表定义,可以使用 ALTER TABLE 语句。虽然所有的 DBMS 都支持 ALTER TABLE,但它们所允许更新的内容差别很大。以下是使用 ALTER TABLE 时需要考虑的事情:

  1. 理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。

  2. 所有的 DBMS 都允许给现有的表增加列,不过对所增加列的数据类型(以及 NULL 和 DEFAULT 的使用)有所限制。

  3. 许多 DBMS 不允许删除或更改表中的列。

  4. 多数 DBMS 允许重新命名表中的列。

  5. 许多 DBMS 限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。

可以看出,对已有表做更改既复杂又不统一。对表的结构能进行何种更改,请参阅具体的 DBMS 文档。

使用 ALTER TABLE 更改表结构

使用 ALTER TABLE 更改表结构时,必须给出以下信息:

  1. 在 ALTER TABLE 之后给出要更改的表名(该表必须存在,否则将出错)。
  2. 列出要做哪些更改。

因为给已有表增加列可能是所有 DBMS 都支持的唯一操作,所以我们举个这样的例子:

ALTER TABLE Vendors
ADD vend_phone CHAR(20);

分析:
这条语句给 Vendors 表增加一个名为 vend_phone 的列,其数据类型为 CHAR

更改或删除列、增加约束或增加键,这些操作也使用类似的语法。
注意,下面的例子并非对所有 DBMS 都有效:

ALTER TABLE Vendors
DROP COLUMN vend_phone;

复杂的表结构更改

复杂的表结构更改一般需要手动删除过程,涉及以下步骤:

  1. 用新的列布局创建一个新表;
  2. 使用 INSERT SELECT 语句(关于这条语句的详细介绍,请参阅第 15 课)从旧表复制数据到新表。有必要的话,可以使用转换函数和计算字段;
  3. 检验包含所需数据的新表;
  4. 重命名旧表(如果确定,可以删除它);
  5. 用旧表原来的名字重命名新表;
  6. 根据需要,重新创建触发器、存储过程、索引和外键。

说明:ALTER TABLE 和 SQLite

SQLite 对使用 ALTER TABLE 执行的操作有所限制。最重要的一个限制是,它不支持使用 ALTER TABLE 定义主键和外键,这些必须在最初创建表时指定。

注意:小心使用 ALTER TABLE

使用 ALTER TABLE 要极为小心,应该在进行改动前做完整的备份(表结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。

3. 删除表

删除表(删除整个表而不是其内容)非常简单,使用 DROP TABLE 语句即可:

DROP TABLE CustCopy;

分析:
这条语句删除 CustCopy 表(第 15 课中创建的)。删除表没有确认步骤,也不能撤销,执行这条语句将永久删除该表。

提示:使用关系规则防止意外删除

许多 DBMS 允许强制实施有关规则,防止删除与其他表相关联的表。在实施这些规则时,如果对某个表发布一条 DROP TABLE 语句,且该表是某个关系的组成部分,则 DBMS 将阻止这条语句执行,直到该关系被删除为止。如果允许,应该启用这些选项,它能防止意外删除有用的表。

4. 重命名表

每个 DBMS 对表重命名的支持有所不同。对于这个操作,不存在严格的标准。以下是不同 DBMS 的支持情况:

  • DB2、MariaDB、MySQL、Oracle 和 PostgreSQL 用户使用 RENAME 语句;
  • SQL Server 用户使用 sp_rename 存储过程;
  • SQLite 用户使用 ALTER TABLE 语句。

所有重命名操作的基本语法都要求指定旧表名和新表名。不过,存在 DBMS 实现差异。关于具体的语法,请参阅相应的 DBMS 文档。

小结

本文介绍了几条 SQL 语句:

  • CREATE TABLE 用来创建新表;
  • ALTER TABLE 用来更改表列(或其他诸如约束或索引等对象);
  • DROP TABLE 用来完整地删除一个表。

这些语句必须小心使用,并且应该在备份后使用。由于这些语句的语法在不同的 DBMS 中有所不同,所以更详细的信息请参阅相应的 DBMS 文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注:使用uipath stversion:2024.10.6,所有学习来源自uipath Academy 首先,打开uipath给我们提供的一个网站 ACME,这个网站呢,需要提前注册一下的哈。 今天呢,就是记录一下,怎…

Unity编译Android apk包进度奇慢或gradle报错的解决方案

最近遇到Unity编译Android apk进度卡在"Calling IPostGenerateGradleAndroidProject callbacks"进度一直不变,如下图: 最后提示编译失败,类似错误如下: Picked up JAVA_TOOL_OPTIONS: -Dfile.encodingUTF-8FAILURE: Bu…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分,感知可能不明显;而如果丢字发生在高能量部分或关键音素上,感知…

CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读

24年5月的论文,上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法,实现…

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产,模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中,模型减面工作是同时关乎质量和性能这两个要素的重要工…

黑马程序员Java笔记整理(day08)

1.代码块 静态代码块 实例代码块 2.内部类 成员内部类 静态内部类 局部内部类 匿名内部类 认识 常见使用形式 应用场景 简化版本 另一个应用场景 3.函数式编程 Lambda 函数简化 方法引用 4.常用API String ArrayList 5.GUI编程 快速认识 事件处理 三种常用写法 第一种 第二…

redis延迟队列

Redis延迟队列 Redis延迟队列是基于Redis构建的消息队列,用来处理需延迟执行的任务。 基本原理 它借助Redis的有序集合(Sorted Set)数据结构达成目的。会把任务及其执行时间分别当成成员与分值存进有序集合,由于执行时间作为分值&…

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接

【JDBC】入门增删改查

JDBC JDBC概述 JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。 XML方式…

Java开发-后端请求成功,前端显示失败

文章目录 报错解决方案1. 后端未配置跨域支持2. 后端响应的 Content-Type 或 CORS 配置问题3. 前端 request 配置问题4. 浏览器缓存或代理问题5. 后端端口未被正确映射 报错 如下图,后端显示请求成功,前端显示失败 解决方案 1. 后端未配置跨域支持 …

Dify服务器部署教程

Dify的github地址: https://github.com/langgenius/dify 服务器要求:2c4g 1、克隆仓库 可以通过命令或者下载zip解压后上传服务器都行 git clone https://github.com/langgenius/dify.git 2、docker启动 cd dify/dockercp .env.example .envdocker compose up -d…

砝码称重(2021年蓝桥杯)

【问题描述】 你有一架天平和N个砝码,这N个砝码的重量依次是w1,w2,……,wn。(1~n为下标) 请你计算利用N个砝码一共可以称出多少种不同的重量? 【注意】砝码可以放在天平的两边 【输入格式】 第一行包含一个整数N。 第二行包含N个…

KaiOS 4.0 | DataCall and setupData implemention

相关文档 1、KaiOS 3.1 系统介绍 KaiOS 系统框架和应用结构(APP界面逻辑)文章浏览阅读842次,点赞17次,收藏5次。对于Java开发者而言,理解JS的逻辑调用是有点困难的。而KaiOS webapp开发又不同于现代的web开发,更像chrome浏览器内嵌模式。在这里梳理一下kaios平台web应用…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图,如下: 图片可点击放大 接下来我们来介绍一下 推荐学习:GIS入门模型构建器Arcpy批量…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads,根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放,我选择直接屏蔽了 B站设置

mysql锁机制以及隔离级别下保证并发安全的方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 mysql锁机制以及隔离级别下保证并发安全的方式 多事务并发执行可能出现的问题mysql有那些锁全局锁表级锁行锁 在不同的隔离级别下mysql保证并发安全的方式RU隔离级别RC隔离级…

qwenvl 以及qwenvl 2 模型架构理解

qwenvl 模型理解: 参考资料: https://qwenlm.github.io/zh/blog/qwen2-vl/ https://github.com/QwenLM/Qwen2-VL?tabreadme-ov-file https://qwenlm.github.io/zh/blog/qwen2-vl/ 论文: qwenvl https://arxiv.org/abs/2308.12966 Qwen2-VL …

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及,即便是零编程基础或基础薄弱的用户,也可以借助AI完成许多技术任务。然而,要高效地使用AI完成编程任务,关键在于如何清晰表达需求,并逐步引导AI实现目标。 在本文中,我们将通过开发…

AI生成视频字幕--VideoCaptioner/卡卡字幕助手

github: https://github.com/WEIFENG2333/VideoCaptioner 123云盘:https://www.123865.com/s/inrnjv-1sk6H提取码:4455 B站教程:https://www.bilibili.com/video/BV1giBqYtEqG?vd_source8e73ffa42accf9446f3cb7fddc85b38c 优点:1.免费&am…

嵌入式单片机窗口看门狗控制与实现

窗口看门狗 注意:WWDG外设没有独立的时钟源,而是挂载在APB1总线下,APB1总线外设时钟为42MHZ。 了解WWDG外设的使用流程,可以参考stm32f4xx_wwdg.c的开头注释,具体流程如下图所示