6,修改資料(筆記)

tonykorn97發表於2007-05-04

下列語句用力修改資料:
delete
insert
update


刪除行
刪除表的所有行
delete from customer;
delete customer;

使用truncate table刪除所有行。
使用truncate table語句快速地從表中除去所有行,同時除去所有相應的索引資料。提交事務之後,不能恢復刪除的行。

使用truncate table語句除去行比使用delete語句除去行速度要快,原因如下:
1,截斷表不會觸發表的delete觸發器。
2,不會對正在截斷的表的每一行進行邏輯日誌記錄。

使用truncate table從朝表中刪除資料。
在將truncate table語句與層次結構的超表配合使用時,only關鍵字執行只截斷超表或截斷超表及其所有子表。在預設情況下
(不使用only),截斷超表及其所有子表,假設你建立了超表person,並在它下面定義了兩個子表employee和sales_rep,以下
truncate table語句從person,employee和sales_rep表中刪除行;
truncate table person;

要將刪除僅限制於超表中的行,必須在truncate table語句中使用only關鍵字,例如:只刪除person表中的行。
truncate table only person;

刪除指定行
delete語句中的where子句的格式與select 語句中的where子句相同。可以使用它來精確指定應刪除的一行或多行。
delete from customer where customer_num = 175;

刪除選擇的行
delete from customer where company = 'Druid cyclery'

刪除包含行型別的行(IDS)
delete from employee where address.city = 'san jose';

刪除包含指定型別的行(IDS)
DELETE FROM manager where 'Baker' in diect_reports;

從超級表刪除行(IDS)
當刪除超表的各行時,刪除操作的作用域是超表及其子表。假設您建立了超表person,並在它下面定義了兩個子表employee和
sales_rep,對person表執行的以下delete語句從所有表person,employee和sales_rep中刪除行:
delete from person where name = 'Walker';

要將刪除僅限制於超表中的行,必須在delete語句中使用only關鍵字。
delete from only(person) where name = 'Walker';

複雜的刪除條件
delete 語句中的where子句可能會象select語句中的where子句那樣複雜。它可能包含用and和or連線的多個條件,也可能包含子查詢
delete from stock where 0 = (select count(*) from manufact where manufact.manu_code = stock.manu_code)

使用刪除連線(xps)
delete from stock using stock,manufact where stock.manu_code != manufact.manu_code;

插入行
insert語句向表新增新行。該語句具有兩個基本功能。它可以使用您提供的列值建立一個新行。或者它可以使用從其它表選擇的資料
建立一組新行。

單行
insert語句最簡單的形式根據列值的列表建立一個新行,並將該放放置在表中,

insert into stock values (115,'rpc','tire pump',108,'box','6/box');

將行插入到型別表中(IDS)
create row type zip_t
(
z_code char(5),
z_suffix char(4)
);

create row type address_t
(
street varchar(20),
city varchar(20),
state char(2),
zip zip_t
);

create row type employee_t
(
name varchar(30),
address address_t,
salary integer
);

create table employee of type employee_t;

插入到行型別列中(IDS)
insert into employee
values ('poole,john',
row('42 high st','willits','ca',
row(69055,1450))::address_t,35000);

為行型別指定空值
insert into student values('Brauer,howie',null,3.75)

為行型別的特定欄位插入null值時,必須包含row建構函式,一下insert語句顯示可以如何將空值插入到employee表的address列的特定欄位中。

insert into employee
values(
'singer,john',
row(null,'Davis','ca',
row(97000,2000))::address_t,67000
);


將行插入到超級表中(IDS)
INSERT INTO person
values(
'Poole,John'
row('402 saphire st.','Elmondo','ca','69055'),
345605900
)

更新行
使用update語句來更改表的一個或多個現有行中的一個或多個列的內容。此語句有兩種完全不同的形式。
一種允許您按名稱將特定值指定給列;另一種允許您將一系列值(這些值可由select語句返回)指定給一系列。

選擇要更新的行
任一形式的update語句都可以where子句結束。如果省略where子句,則修改所有行。在
where子句中選擇要修改的精確行集可能很複雜。對where 子句的唯一限制時不能在子查詢的from子句中命名更新的表。

update customer set fname = 'barnaby',lname = 'dorfler' where customer_num = 13

還可在where子句中使用子查詢,假定anza公司因為安全原因需要回收網球。結果時,必須將來自制造商ANZ幷包含庫存號6的
所有為交貨訂單設定為延期交貨:
update orders
set backlog = 'y'
where ship_date is null
and order_num in
(select distinct items.order_num from items
where itmes.stock_num = 6
and items.manu_code = 'ANZ');

用統一值進行更新
update stock set unit_price = unit_price * 1.5 where manu_code = 'HRO';

update items set total_price = quantity * (select max(unit_price) from stock where stock.stock_num = items.stock_num)
where items.order_num in (select order_num from orders where ship_date is null);

用選擇的值進行更新
update customer set (fname,lname) = ('Barnaby','Dorfler') where customer_num = 103;

用這種方法編寫語句沒有任何優點。實際上,它更難於閱讀,原因時將那些值指定給那些列不明顯。
但是,當要指定的值來自單個select語句時,此形式就很合理。
update customer
set (address1,address2,city,state,zipcode) =
((select address1,address2,city,state,zipcode from newaddr
where newaddr.customer_num=customer.customer_num))
where customer_num in (select customer_num from newaddr);

更新行型別(IDS)
更新包含已命名行型別的行
update employee set address = Row('103 california st','San Francisco', address.state,address.zip)::address_t
where name = 'zawinul,joe'
更新包含未命名行型別的行
update student set s_address = row(13 sunset','Fresno',s_address.state,s_address.zip) where s_name = 'henry,john'
為行型別的欄位指定空值
update employee set address = row(null::varchar(20),‘Davis','CA',Row(Null::Char(5),null::Char(4)))::address_t)
where name = 'henry,john'

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245654/,如需轉載,請註明出處,否則將追究法律責任。

相關文章