SQL - Data Manipulation Language
DELETE Statement
DELETE语句删除满足给定条件的所有行。
通过DELETE语句删除的行可以通过ROLLBACK语句恢复,除非DELETE已经通过COMMIT语句提交。
DELETE语句不删除表。
DELETE语句不会释放被删除行的磁盘存储空间。
举例说明:
删除一个代码为123的课程:
DELETE FROM COURSE
WHERE cnum = '123';
删除所有12学分或标题包含单词“DATABASE”的课程:
DELETE FROM COURSE
WHERE (credits = 12) OR (UPPER(title) LIKE '%DATABASE%');
删除所有员工总数小于5的部门:
DELETE FROM DEPARTMENT
WHERE total_staff_number < 5;
如果在创建表时存在一个外键offered_by参考的是DEPARTMENT(name)这个属性。
CONSTRAINT course_fkey1 FOREIGN KEY(offered_by)
REFERENCES DEPARTMENT(name) );
那么如果执行下面语句就会报错:
DELETE FROM DEPARTMENT WHERE name='Physics';
ERROR at line 1:
ORA-02292: integrity constraint (JRG.COURSE_FKEY1) violated - child record found
因此我们要先删除外键offered_by的行才能成功删除主键name的行。
然而有一个意外就是在创建表时声明了ON DELETE CASCADE。
如果ON DELETE CASCADE没有在描述中被使用,那么行被删除的顺序是重要的!!
先外后主。
如果有ON DELETE CASCADE声明时,删除主键会连带删除相关外键。
否则,必须删除与外键值相同的行。
INSERT Statement
NSERT语句将新行插入到关系表中,并自动验证一致性约束。
插入语句的内容要与插入的表的属性定义一致。
INSERT INTO DEPARTMENT
VALUES ('Computer Science', 'CSCI', 30, 'Peter', 123456.9 );
INSERT INTO COURSE(cnum, title, offered_by, credits)
VALUES('MATH345', 'Topology', 'Mathematics', 6);
需要注意的一点就是,与删除相反,如果插入的属性涉及多个表,那么则需要先插入主表再插⼊入副表。
将行插入到关系表中的顺序非常重要!!
先主后副。
插入语句应该是SQL中最重要也是最常用的语句了,在后面的几篇文章我会着重介绍一下INSERT Statement的各种用法。
UPDATE Statement
UPDATE语句修改所有满足给定条件的行。
UPDATE语句修改的属性值可以通过ROLLBACK语句还原,除非UPDATE语句已经被COMMIT。
将’123、456和789课程的总学分改为12学分:
UPDATE COURSE
SET credits = 12
WHERE cnum IN ('123', '456', '789');
将主席的名字改为JFM,增加一名物理系的总成员。
UPDATE DEPARTMENT
SET chair = 'JFM',
total_staff_number = total_staff_number + 1
WHERE name = 'Physics';
UPDATE声明的顺序也很重要,同样,若没有CASCADE声明,则需要先更更新副表外键,再更更新主表相联键。
References
-
T. Connoly, C. Begg, Database Systems, A Practical Approach to Design, Implementation, and Management, Chapter 6.3.10 Database Updates, Pearson Education Ltd, 2015.
-
D. Darmawikarta, Oracle SQL : A Beginner’s Tutorial Brainy Software Inc. First Edition: June 2014.