首页 > 数据库 >SQL基础总结(九):插入更新删除行及创建更新删除表

SQL基础总结(九):插入更新删除行及创建更新删除表

时间:2023-09-14 14:01:47浏览次数:32  
标签:删除 行及 更新 约束 键值 TABLE table 主键


本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)

--------------------------------

插入更新删除行

 

使用INSERT插入行

INSERT INTO table VALUES(value1,value2,value3…);

INSERT INTO table(column1,column2,column3) VALUES(value1,value2,value3);

 

INSERT INTO table(column1,column2,column3) subquery;

Subquery中列的数量必须等于INSERT的列的数量。

Subquery中SELECT 返回的结果为空是合法的,而且并不插入行。

 

可以通过视图插入行。

 

使用UPDATE更新行

UPDATE table SET column = expr [WHERE search_condition];

search_condition可以是子查询或者WHERE条件。

 

通过CASE更新,例:

UPDATE titles SET prise = prise*

 CASE type

   WHEN ‘history’ THEN 1.10

   WHEN ‘psychology’ THEN 1.12

   ELSE 1

END;

 

更新中使用子查询:

UPDATE titles SET pub_id=(SELECT pub_id FROM publishers WHERE pub_name=’aaa’)

WHERE pub_id=(SELECT pub_id FROM publishers WHERE pub_name=’bbb’);

DBMS使用引用列更新之前的值计算SET或WHERE子句中的表达式。

可以通过视图更新行。

 

SQL2003引入了MERGE语句作为在一条语句中结合运用多个UPDATE和INSERT操作的简便方法。ORACLE、DB2支持MERGE。

 

使用DELETE删除行

DELETE FROM table [WHERE search_condition];

search_condition可以是WHERE条件或子查询条件。

 

如果想删除表中的所有行,TRUNCATE语句比DELETE要快且使用的系统资源少。TRUNCATE不是标准SQL的一部分,但部分DBMS支持它。TRUNCATE清空整张表。使用TRUNCATE,代价是有错误就无法恢复到变化前(回滚)。

TRUNCATE TABLE table;

 

创建、更新和修改表

 

约束:

NOT NULL阻止向列中插入空值

PRIMARY KEY设置表的主键列

FOREIGN KEY设置表的外键列

UNIQUE阻止向列中插入重复的值

CHECK使用逻辑(布尔)表达式限制插入列中的值

 

列约束:是列定义的一部分,它设置作用于列的条件。

表约束:有别于列定义并加强于表中多个列条件,可以在一个表约束中包含多个列。

如果不显示命名约束,DBMS将自动产生并分配约束的名称。应该用CONSTRAINT子句分配自定义的约束名。约束名在一个表中必须是唯一的。

CONSTRAINT constraint_name;

 

使用NOT NULL禁止空值

 

使用DEFAULT确定默认值

在CREATE TABLE列定义中使用关键字DEFAULT定义默认值。

 

使用PRIMARY KEY指定主键

主键不允许为空值。

每个表只能有一个主键。

在CREATE TABLE的定义中使用关键字PRIMARY KEY定义主键约束。

一个表不能有一个以上的主键约束。

主键约束总是显示命名,使用CONSTRAINT子句来实现。

所有主键列都是NOT NULL的。

 

使用FOREIGN KEY指定外键

外键与引用表的主键或候选主键建立直接关系,于是外键的值被限于已经存在的父键值。这个约束被称为引用完整性。

外键不像主键,允许空值。

表可以有零个或多个外键。

外键值在表中通常不是唯一的。

在CREATE TABLE的定义中使用关键字FOREIGN KEY或REFERENCES来定义外键约束。

 

当试图更新或删除外键值所引用的键值(在父表中)时,SQL允许定义DBMS要采取的行为。要触发一个引用行为,在FOREIGN KEY约束中使用ON UPDATE或ON DELETE子句。

 

ON UPDATE action:当试图UPDATE一个行中被其它表的外键引用的键值(在父表中)时,action为下列4个值中的一个:

CASCADE:更新依赖的外键值为新的父表值。

SET NULL:将依赖的外键值改为空值。

SET DEFAULT:将依赖的外键值改为默认值。

NO ACTION:当违反外键约束时产生一个错误提示,这是默认行为。

 

ON DELETE action:当试图DELETE一个行中被其它表的外键引用的键值(在父表中)时,

action为下列4个值中的一个:

CASCADE:删除所包含的外键值与要删除的主键值匹配的行。

SET NULL:将依赖的外键值改为空值。

SET DEFAULT:将依赖的外键值改为默认值。

NO ACTION:当违反外键约束时产生一个错误提示,这是默认行为。

 

使用UNIQUE确保值唯一

唯一约束和主键约束区别:唯一列可以包含空值、表可以包含多个唯一列。

唯一约束可以禁用空值。

使用CHECK检查约束

通常检查最大值、最小值、具体值、一定范围的值。

 

CREATE TABLE table(

Column1 data_type NOT NULL,

Column2 data_type NOT NULL,

Column3 data_type DEFAULT ‘’,

Column4 data_type ,

Column5 data_type NOT NULL UNIQUE,

CONSTRAINT constraint_name_pk PRIMARY KEY(Column1,Column2),

CONSTRAINT constraint_name_fk FOREIGN KEY(Column4) REFERENCES ref_table(id) ON UPDATE cascade,

CONSTRAINT constraint_name_check CHECK(Column5 IN (‘A’,’B’,’C’,’D’))

);

 

使用CREATE TEMPORARY TABLE创建临时表

基础表:持久保存数据直到显示删除表为止。SQL也允许创建临时表来存储中间结果。

临时表是在会话或事务结束时DBMS能自动清空的表(数据和表都被删除)。

临时表最初没有行,可以像在基本表那样插入、更新和删除行。

如果创建了巨大的临时表,可以自己删除而不是等DBMS来释放内存。

CREATE {LOCAL|GLOBAL} TEMPORARY TABLE table(

//与基本表相同。

);

LOCAL表明是局部临时表,仅用户自己可用,当DBMS进程结束时就会消失。

GLOBAL表明是全局临时表,可以被其它用户访问,当DBMS会话和其它引用它的任务结束时,就会消失。

 

对于所有DBMS,查阅文档了解DBMS如何处理与基本表名字相同的临时表。

在某些情况下,临时表会在被删除之前,隐藏或封闭同名的基本表。

 

使用CREATE TABLE AS利用已存在表创建新表

CREATE TABLE new_table AS subquery;

Subquery是一个返回插入到new_table表行的SELECT语句。使用subquery的结果决定new_table的结构和列的顺序。

不管SELECT引用的数据表有多少,CREATE TABLE AS只向一个表中插入数据。新表不能和已存在的表同名。

 

为了可移植性,不要使用CREATE TABLE AS或SELECT INTO。应该使用CREATE TABLE创建新的空表,然后使用INSERT SELECT添加值。

 

使用ALTER TABLE修改表

ALTER TABLE table alter_table_action;

alter_table_action为:

ADD COLUMN column type [constraint];

ALTER COLUMN column SET DEFAULT expr;

DROP COLUMN column [RESTRICT|CASCADE];

ADD table_ constraint;

DROP CONSTRAINT constraint_name;

 

使用DROP TABLE删除表

可以删除基本表和临时表。

删除表就意味着删除了表的结构、数据、索引、约束、授权等。

删除表并未删除引用这个表的视图。

DROP TABLE table;

 

SQL允许指明RESTRICT(限制)或CASCADE(级联)删除行为,RESTRICT(安全的)防止删除视图或别的约束引用的表。CASCADE(不安全的)引发引用对象随着表一同被删除。

 

标签:删除,行及,更新,约束,键值,TABLE,table,主键
From: https://blog.51cto.com/u_6978506/7469770

相关文章

  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......
  • 关闭win10自动更新
    win10系统自动更新有多烦相必不用我多说了,网上给出了关闭服务、关闭策略等方法,貌似是治标不治本,今天无意间看到b站一个视频讲这个,试了一下果然有效,所以贴在这里并且简单叙述一下。简单说一下步骤:1.调时间打开Windows设置,时间和语言->关闭"自动设置时间"开关,点"手动设置日......
  • 共享文件夹添加 文件删除 可以被记录
    事件起因:在生产服务器上,某项目文件被删除,但是不知道具体是谁删除的,到底是误删除还是故意删除,所以才有了本次操作 解决办法:在生产服务器上的操作:1、选中文件夹--属性--安全--高级--审核--添加--选择主体Domainuser--显示高级权限删......
  • TDengine 3.1.1.0 来啦!更新如下
    自3.0版本发布以来,在研发人员和社区用户的不断努力下,TDengine 做了大量更新,产品稳定性和易用性也在不断提升。近日,TDengine3.1.1.0成功发布,本文将向大家简单介绍一下该版本涉及的重大更新。写在前面伴随2023年9月官网改版,TDengine正式升级为高性能、分布式的物联网、......
  • linux中普通用户如何防止重要文件被意外删除
     001、[liujiaxin01@pc1~]$lstest01[liujiaxin01@pc1~]$pwd##普通用户家目录/home/liujiaxin01[liujiaxin01@pc1~]$tree##重要文件所在目录.└──test01└──import_file.txt1directory,1file[liujiaxin01@pc1~]$cp-rtest01/tes......
  • destoon根据标题删除重复数据
    因为采集数据比较庞大,难免出现重复数据,所以写了一个根据标题进行删除重复数据的mysql命令,需要的朋友可以使用。DELETEfromdestoon_article_36where`title`in(SELECT*from(SELECT`title`FROMdestoon_article_36GROUPBY`title`HAVINGCOUNT(1)>1)tmp2)......
  • 利用find命令按照创建、修改时间删除文件
    使用touch命令修改文件访问时间和修改时间:touch-t202301011200 Example.txt删除三十天前创建的时间find/path/to/dir-typef-ctime+5-delete 目前还不确定如何修改文件创建时间,但是可以利用上述find语句删除修改时间和访问时间在条件内的文件 ......
  • 13-变量的申明-初始化-删除变量-垃圾回收机制
       需要先定义,做一个初始化,不然直接输入ddd会报错,没有被定义 此处a已经被删除了,3仍然在 通过垃圾回收机制把不用的对象进行回收,释放内存 ......
  • MySql数据库中,对于同一个表,如果直接把查询结果赋值给待更新字段,则会出现锁表的情况。
    MySql数据库中,对于同一个表,如果直接把查询结果赋值给待更新字段,则会出现锁表的情况。原因是:mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。update时,会锁表,此时不能再select。所以会报错,此时如果将......
  • python学习笔记(持续更新)
    一、对列表的操作#建立一个列表list=[1,2,3,4]#打印列表print(list)#在列表尾部添加元素list.append(5)#在指定位置插入元素list.insert(0,0)#在0位置插入元素0#在尾部插入另一个列表List=[5,6,7]list.extend(List)#删除指定位置的元素list.remove(0)#移除指定......