SQLServer 2008 MyBatis+聯合主鍵+批量插入+忽略重複數據+聯合外鍵

需求:批量添加設備,每一個設備,都從屬於各自網絡節點下的某個控制器。設備有多條定時信息。

分析:1.批量插入設備數據,在設備數量較多時可以提升效率。

           2.該設備只能通過網絡節點id,控制器id和自身id確認唯一性。因此需要使用聯合主鍵。

           3.可能有重複數據存在,如節點1_控制器1_設備1多次嘗試添加自己。需要忽略重複數據。

           4.定時信息表需要外鍵映射設備表,設備表示聯合主鍵,因此定時信息表需要添加聯合外鍵。本例中,定時表外鍵關聯只關心刪除功能,即,刪除某個設備後,會自動將外鍵關聯的定時信息一起刪除。

 

該問題可以在建表時解決。

           1.設置聯合主鍵確定一個設備。

           2.MyBatis批量插入的xml寫法,必須所有元素均不得爲空

           3.使用IGNORE_DUP_KEY=ON忽略重複數據。避免批量插入發生重複時拋出異常,數據回滾。

           4.給定時信息表添加外鍵,關聯刪除

逐個解決:

1.建表

設備表:建表和設置聯合主鍵,聯合主鍵的組成元素都要設置不得爲null。如下建表,設置了“IGNORE_DUP_KEY = ON”,即可忽略重複數據

if exists (select * from sysobjects where id = OBJECT_ID('[SysDevice]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [SysDevice]


CREATE TABLE [SysDevice] (
[Id] [int]  IDENTITY (1, 1)  NOT NULL,
[Station_Address] [varchar]  (100) NOT NULL,
[Controller_Addr] [varchar]  (100) NOT NULL,
[Device_Addr] [varchar]  (100)NOT NULL,
)


alter table [SysDevice] add constraint PK_Id primary key(Station_Addressasc,Controller_Addr asc,Device_Addr asc)WITH (IGNORE_DUP_KEY = ON);

定時表:建表和添加外鍵關聯設備表

if exists (select * from sysobjects where id = OBJECT_ID('[Timing]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [Timing]

CREATE TABLE [Timing] (
[Id] [int]  IDENTITY (1, 1)  NOT NULL,
[Start_Time] [datetime]  NULL,
[End_Time] [datetime]  NULL,
[Create_Time] [datetime]  NULL,
[Station_Address] [varchar]  (100) NOT NULL,
[Controller_Addr] [varchar]  (100) NOT NULL,
[Device_Addr] [varchar]  (100)NOT NULL,
CONSTRAINT Timing_fk FOREIGN KEY ([Station_Address], [Controller_Addr],[Device_Addr]) REFERENCES SysDevice ([Station_Address], [Controller_Addr],[Device_Addr]) on delete cascade
)

ALTER TABLE [Timing] WITH NOCHECK ADD  CONSTRAINT [PK_Timing] PRIMARY KEY  NONCLUSTERED ( [Id] )

MyBatis批量插入寫法。

mapper.java

int insertBatch(@Param("list") List<Device> list);

mapper.xml

  <insert id="insertBatch" parameterType="java.util.List">
    insert into SysDevice
    (Station_Address,Controller_Addr,Device_Addr,Device_Type)
    values
    <foreach collection="list" item="item" index="index" separator=",">
      (#{item.stationAddress},#{item.controllerAddr},#{item.deviceAddr},#{item.deviceType})
    </foreach>
  </insert>

除了id自增長,其餘屬性都不得爲空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章