2015年7月22日 星期三

[DB] 新增時如何指定自動流水號的值

在最近的案子中

因為客戶的懶惰,

雖然我們做了後台輸入畫面

但是客戶還是要求我們把A資料庫的東西自動帶到B資料庫

雖然客戶懶惰,但工程式更不勤勞

怎麼可能用我寫好的輸入介面一筆一筆新增XD

是我們的系統做的不好嗎?

不對!!!!!!絕對不是這樣的!!!!!

是我知道insert select這個指令!!!

insert into B.dbo.Employee (Id, Name)
select Id, Name
from A.dbo.Employee

這樣不就方便多了

但如果PK遇到自動增加的流水號

就會遇到下列錯誤訊息

Cannot insert explicit value for identity column in table 'Employee' when IDENTITY_INSERT is set to OFF.

意思是說:不能在 IDENTITY_INSERT OFF 的情況下新增 IDENTITY的欄位

反過來說,在 IDENTITY_INSERT ON 的情況下就可以新增 IDENTITY的欄位嗎?

沒錯!!  就是這樣

因此,如果要手動新增自動識別的值,必須像下面這樣


SET IDENTITY_INSERT B.dbo.Employee ON

insert into B.dbo.Employee (Id, Name)
select Id, Name
from A.dbo.Employee

SET IDENTITY_INSERT B.dbo.Employee OFF

不過這個有個缺點,就是不能使用 insert into ... select *

必須把要新增的欄位全部寫出來,其實還蠻麻煩的

至於在甚麼情況下需要這樣呢?

為什麼不讓B的Employee資料的主鍵自動新增呢?

因為有該死的Detail檔ㄚㄚ啊!!!

自動新增的話會找不到主檔的PK

但自動新增主鍵的情況下也不是完全沒解

只是比較麻煩,要先取得新增的流水號在insert到detail

所以....嗯哼

下回預告:新增後取得自動產生的流水號

沒有留言:

張貼留言