【SQL 必知必会】- 第十七课 创建和操纵表

news2025/1/15 23:46:54

目录

17.1 创建表

        17.1.1 表创建基础

        替换现有的表

        17.1.2 使用NULL值

        主键和NULL 值

        理解NULL

        17.1.3 指定默认值

        使用DEFAULT 而不是NULL 值

17.2 更新表

        小心使用ALTER TABLE

17.3 删除表

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

17.4 重命名表

17.5 小结


        这一课讲授创建、更改和删除表的基本知识。

17.1 创建表

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

        17.1.1 表创建基础

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

  • 新表的名字,在关键字CREATE TABLE 之后给出;
  • 表列的名字和定义,用逗号分隔;
  • 有的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
);

        不同DBMS 的CREATE TABLE 的语法有所不同,这个简单脚本也说明了这一点。这条语句在Oracle、PostgreSQL、SQL Server 和SQLite中有效,而对于MySQL,varchar 必须替换为text;对于DB2,必须从最后一列中去掉NULL。这就是对于不同的DBMS,要编写不同的表创建脚本的原因。


        替换现有的表

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


        17.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
);

        如果插入没有值的列,将返回错误,且插入失败。下一个例子将创建混合了NULL 和NOT 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)
);

        主键和NULL 值

        第1课介绍过,主键是其值唯一标识表中每一行的列。只有不允许NULL值的列可作为主键,允许NULL 值的列不能作为唯一标识。


        理解NULL

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


        17.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
);

        默认值经常用于日期或时间戳列。


        使用DEFAULT 而不是NULL 值

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


17.2 更新表

        更新表定义,可以使用 ALTER TABLE 语句。以下是使用ALTERTABLE 时需要考虑的事情:

  • 理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。
  • 所有的DBMS 都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL 和DEFAULT 的使用)有所限制。
  • 许多DBMS 不允许删除或更改表中的列。
  • 多数DBMS 允许重新命名表中的列。
  • 许多DBMS 限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。

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

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

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

ALTER TABLE Vendors ADD vend_phone CHAR(20);

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

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

ALTER TABLE Vendors DROP COLUMN vend_phone;

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

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

        小心使用ALTER TABLE

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


17.3 删除表

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

DROP TABLE tableName;

       删除表没有确认,也不能撤销,执行这条语句将永久删除该表。

        相关删除表的语句参见博客:Oracle常用SQL语句


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

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


17.4 重命名表

        每个DBMS 对表重命名的支持有所不同。对于这个操作,不存在严格的标准。所有重命名操作的基本语法都要求指定旧表名和新表名。


17.5 小结

        CREATE TABLE 用来创建新表,ALTER TABLE 用来更改表列(或其他诸如约束或索引等对象),而 DROP TABLE 用来完整地删除一个表。这些语句必须小心使用,并且应该在备份后使用。

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

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

相关文章

【MyBatis Plus】002 -- 通用CRUD(插入、更新、删除、查询)

目录 3、通用CRUD 3.1 插入操作 3.1.1 方法定义 3.1.2 测试用例 3.1.3 测试 3.1.4 TableField 3.2 更新操作 3.2.1 根据id更新 3.2.2 根据条件更新 3.3 删除操作 3.3.1 根据id删除(deleteById) 3.3.2 根据Map删除数据(deleteByMap&#xff09…

程序员必备技巧:Git 和 GitHub 中高效地将单个文件还原为特定提交

Git 和 GitHub 用于存储您的旧代码,允许您在出现问题时回滚并安全地恢复以前的准确代码。 与其他开发人员协作时,了解如何将单个文件恢复为特定提交也变得至关重要。这是因为,在处理某个功能时,您可能需要修改不相关的文件来测试…

Cursor编程初体验,搭载GPT-4大模型,你的AI助手,自然语言编程来了

背景 这两天体验了下最新生产力工具Cursor,基于最新的 GPT-4 大模型,目前免费,国内可访问,不限次数,跨平台,你确定不来体验一把?官方的 Slogan : Build Software. Fast. Write, edi…

【CSS】课程网站 Banner 制作 ② ( Banner 栏版心盒子测量 | Banner 版心盒子模型左侧导航栏代码示例 )

文章目录一、Banner 栏版心盒子测量1、测量版心元素尺寸2、课程表测量二、Banner 版心盒子模型左侧导航栏代码示例1、HTML 标签结构2、CSS 样式3、展示效果一、Banner 栏版心盒子测量 1、测量版心元素尺寸 拉四条辅助线 , 将版心包起来 , 可以测量 Banner 条版心的尺寸为 1200 …

Nginx网站服务详解(第二部分:Nginx服务的主配置文件 ——nginx.conf)

1. 全局配置的六个模块简介 全局块:全局配置,对全局生效;events块:配置影响 Nginx 服务器与用户的网络连接;http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置&…

SLBR通过自校准的定位和背景细化来去除可见的水印

一、简要介绍 本文简要介绍了论文“Visible Watermark Removal via Self-calibrated Localization and Background Refinement ”的相关工作。在图像上叠加可见的水印,为解决版权问题提供了一种强大的武器。现代的水印去除方法可以同时进行水印定位和背景恢复&#…

C++ 实现 Matlab 的 lp2lp 函数

文章目录1. matlab 的 lp2lp 函数的作用2. matlab 的 lp2lp 函数的使用方法3. C 实现3.1 complex.h 文件3.2 lp2lp.h 文件4. 测试结果4.1 测试文件4.2 测试3阶的情况4.3 测试9阶的情况1. matlab 的 lp2lp 函数的作用 去归一化 H(s) 的分母 2. matlab 的 lp2lp 函数的使用方法…

人脸识别经典网络-MTCNN(含Python源码实现)

人脸检测-mtcnn 本文参加新星计划人工智能赛道:https://bbs.csdn.net/topics/613989052 文章目录人脸检测-mtcnn1. 人脸检测1.1 人脸检测概述1.2 人脸检测的难点1.3 人脸检测的应用场景2. mtcnn2.1 mtcnn概述2.2 mtcnn的网络结构2.3 图像金字塔2.4 P-Net2.5 R-Net2…

为什么说过早优化是万恶之源?

Donald Knuth(高德纳)是一位计算机科学界的著名学者和计算机程序设计的先驱之一。他被誉为计算机科学的“圣经”《计算机程序设计艺术》的作者,提出了著名的“大O符号”来描述算法的时间复杂度和空间复杂度,开发了TeX系统用于排版…

开启数字新时代,5G-Advanced加速带入现实!

在过去的这些年里,我们亲眼见证了5G的崛起。据GSMA&GSA统计,截至2022年12月,全球共部署了超过240张5G商用网络,5G用户超过10亿。在韩国、瑞士、芬兰等地,5G用户渗透率已超过30%。中国的5G网络建设更是独领风骚。截…

形式语言与自动机总结---上下文无关文法(CFG)

第5章上下文无关文法: 设计文法: 做题的时候发现了一个正则表达式到文法的算法 R规则 根据正则式推导右线性文法_右线性文法表达ab*_Pluto 的博客-CSDN博客 举例 设计文法的关键在于理解递归性,文法是一个迭代器 1.The set {| i ≠ j or j ≠ k}, that is, the set of st…

AIGC时代,分享11款超实用AI生成内容检测工具

前往未来百科查看全部AI内容检测工具箱 一、AI 内容检测器 在数字内容创作的世界中,高质量的内容对至关重要。但随着创建的内容量不断增加,确保内容是原创的、高质量的非常具有挑战性。 AI 内容检测器指的是一种利用人工智能技术来自动化审核和识别不当…

进程优先级

目录: 1.进程优先级的概念 2.查看进程优先级的方案 3.linux当中进程的优先级共有40个级别 4.对于进程的其它概念 ---------------------------------------------------------------------------------------------------------------------- 1.进程优先级的概念 为…

Talk预告 | ICLR‘23 斯坦福大学计算机系博士后吴泰霖:学习可控的自适应多分辨率物理仿真

本期为TechBeat人工智能社区第478期线上Talk! 北京时间3月8日(周三)20:00,斯坦福大学计算机系博士后——吴泰霖的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “学习可控的自适应多分辨率物理仿真”,届时将分…

灌区泵站及闸门控制自动化系统

根据灌区泵站及闸门控制现状,利用智能终端与互联网相结合方法,实施取水、输水、供水、灌溉、排水、防洪和水资源管理等自动控制系统,实现骨干渠道灌排闸门现场及远程自动控制和远程监测监视,达到计划配水、精准灌溉,高…

AJAX起步入门——介绍和使用

Ajax起步入门——介绍和使用基本用例场景复现核心干货AJAX简介ajax是什么?ajax工作原理ajax是基于现有的Internet标准AJAX实例实例演示实例代码ajax实例解析场景复现 最近学习与前端相关的小程序时,接触了异步请求api的封装和实现,涉及到了很…

多线程并发编程笔记07(小滴课堂)容器

同步容器 我们写这样一段代码。 我们想对vector容器在遍历时,去根据条件删除: 会出现异常。 那正确的方式应该如何去写呢,这里就涉及到了迭代器: 单线程中我们是这么做的。 那么多线程中呢? 有的时候它会报这个错误…

ChatGPT最强对手Claude使用教程

Cladue最近很火,作为ChatGPT4的平替版,它无需付费,使用方便,很多网友通过效果对比,发现它的性能要好于ChatGPT3.5,可以媲美ChatGPT4。最主要是使用很方便,十分钟就可以轻松部署,下面…

MongoDB初认识

MongoDB初认识 文章目录MongoDB初认识0. 写在前面1. MongoDB是什么2. MongoDB的优缺点3. 基础概念解析4. 安装4.1 下载地址4.2 安装MongoDB4.3 pgrep使用4.4 进入 shell 交互页面0. 写在前面 Linux版本:CentOS7.5 MongoDB版本:MongoDB-5.0.2&#xff08…

asp.net博客管理系统统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net博客管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 。 二、功能介绍 普通的用户是 123 密…