您的位置:首页 > 数据库

SQL 之 修改数据

2016-10-06 19:57 134 查看
关键字:INSERT INTO , VALUES , DELETE , TRUNCATE TABLE , UPDATE

修改数据:

(1)插入新的行

(2)删除表中的行

(3)更新表中指定的行与列已有的数据

一、修改策略

修改数据的机制十分直接,意味着非常危险。实际中有各种可以帮助防止灾难性错误的策略。

(1)删除行时,可以使用软删除技术,这并不是真正从物理上删除行,可以用表中一个特定的列来标记每行是否有效还是无效。我们只把一个行标记为无效,而不是删除它。这样,如果删除是误操作,你可以通过修改有效/无效列很容易恢复它。

(2)插入操作,当增加一行时,可以在一个特定的列中标记准确的插入日期和时间。如果后来认为是错误插入,可以很快通过找到特定时间范围内添加的所有行,并且删除它们。

(3)更新操作,通常用一个单独的表来保存事务所要更新的数据。如果出错,可以回到事务表中来找到数据修改之前和之后的值,并且用来撤销之前的任何错误。

二、插入数据

每个表默认有一个自增型的数字(主键),可以不为这行指定数值,插入时只要提供其它字段的值:

1. 插入指定数据

INSERT INTO Customers

(FirstName, LastName, State)

VALUES

('Virginia', 'Jones', 'OH'),

('Clark', 'Woodland', 'CA')

针对本例,Oracle不允许在VALUES后面指定多个行,所以要分开两条语句

顺序方面,VALUES后面的记录的每个字段只需要和INSERT INTO后面的columnlist中所列出的顺序相对应。

列的防止顺序不重要。FirstName, LastName, State可以打乱,插入的行只需要对应就好。

一般格式:

INSERT INTO tableName

(columnlist)

VALUES

(RowValue1),

(RowValue2),

(重复任意次)

RowValue1的列需要和columnlist对应。

插入一行时某列(如果允许为NULL)没有提供值则赋值为NULL。

2. 插入由SELECT语句获取的数据

如果另一个表包含想要插入的数据,可以:

INSERT INTO 

Customers

(FirstName, LastName, State)

SELECT

Name1,

Name2,

State

FROM CustomerTransactions

WHERE State = 'RI'

INSERT INTO tableName1

(columnlist1)

SELECT

(columnlist2)

FROM ableName2

WHERE condition

columnlist2的列需要和columnlist1对应(类型对应或者类型可以兼容,不是列名对应,列名不重要)。

三、删除数据

DELETE

FROM Table

WHERE condition

可以使用COUNT来验证删除的结果。(行数减少?)

如果要删除一个表中所有的数据,使用TRUNCATE TABLE更快(不记录事务的结果,日志是数据库用于恢复数据的一种机制)。

TRUNCATE TABLE Customers

等价于

DELETE FROM Customers

TRUNCATE TABLE重新设置自增型的列的当前值,DELETE语句则不会。

四、更新数据

UPDATE table

SET column1 = expression1,

column2 =  expression2

(repeat any number of times)

WHERE condition

更新多个列,用逗号分隔表达式,但SET只出现一次。PS:WHERE子句是必须的,否则全部行都修改.

SQL是一行一行地去更新,检查每一行的每一列然后确定要不要按照表达式更新。

实际上更常见的还是用一个表的数据去更新另一个表的数据:

比如用CustomerTransaction的State和Zip列的数值去更新Customers表的相应列(两个表通过CustomerID关联)

UPDATE Customers

SET Customers.State =
(SELECT CustomerTransactions.State
FROM CustomerTransactions
WHERE CustomerTransactions.CustomerID = Customers.CustomerID),

Customers.Zip =
(SELECT CustomerTransactions.Zip
FROM CustomerTransactions
WHERE CustomerTransactions.CustomerID = Customers.CustomerID)

WHERE EXISTS
(SELECT *
FROM CustomerTransactions
WHERE CustomerTransactions.CustomerID = Customers.CustomerID)


分析:

子查询

SELECT CustomerTransactions.State
FROM CustomerTransactions
WHERE CustomerTransactions.CustomerID = Customers.CustomerID
 

可以看出这是个关联子查询(单独执行会出错,没有Customers.CustomerID)子查询从CustomerTransactions表中获取数据(State列的数据),并通过CustomerID来匹配两个表。

最后WHERE子句的逻辑和整个UPDATE语句的查询逻辑相关,EXISTS操作符和另一个相关的子查询一起使用,以判断针对Customers表中的每个CustomerID,CustomerTransactions表中是否存在对应的行

如果没有这个WHERE子句的话,CustomerID表中在CustomerTransactions表没有匹配的行也会被修改(为NULL)。也就是,WHERE子句使得我们只对在CustomerTransactions表中有匹配数据的客户进行更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: