SQL 服务器 - 可重复使用的 DML 查询

SQL Server - Reusable DML query

大家早上好,

目前我有这个 DDL:

    /*==============================================================*/
    /* Database name:  Zvcvolkel                                    */
    /* DBMS name:      Microsoft SQL Server 2000                    */                                                
    /*==============================================================*/

    use master
    go


    drop database Zvcvolkel
    go


    /*==============================================================*/
    /* Database: Zvcvolkel                                          */
    /*==============================================================*/
    create database Zvcvolkel
    go


    use Zvcvolkel
    go

    CREATE TABLE Rol(
        Rol_ID  int IDENTITY(1,1),
        R_Naam  varchar(max),

        CONSTRAINT PK_ROL PRIMARY KEY (Rol_ID)
    )
    go

    CREATE TABLE Persoon(
        Persoon_ID      int IDENTITY(1,1),
        Rol_ID          int,
        L_Voornaam      varchar(max),
        L_Achternaam    varchar(max),
        L_Geboortedat   date,
        L_Woonplaats    varchar(max),
        L_Geslacht      char(1),
        L_Rekeningnr    varchar(max),

        CONSTRAINT PK_Persoon PRIMARY KEY (Persoon_ID),
        CONSTRAINT FK_Persoon_Ref_Rol FOREIGN KEY (Rol_ID) REFERENCES Rol (Rol_ID) ON UPDATE CASCADE,
        CONSTRAINT CHK_L_geslacht CHECK (L_geslacht = 'M' OR L_geslacht = 'V')
    )
    go

    CREATE TABLE Medewerker(
        Medewerker_ID   int IDENTITY(1,1),
        Persoon_ID      int,
        M_Salaris       decimal,

        CONSTRAINT PK_Medewerker PRIMARY KEY (Medewerker_ID),
        CONSTRAINT FK_Medewerker_Ref_Persoon FOREIGN KEY (Persoon_ID) REFERENCES Persoon (Persoon_ID) ON UPDATE CASCADE,
        CONSTRAINT CHK_M_Salaris CHECK (M_Salaris >= 0)
    )
    go

    CREATE TABLE Lid(
        Lid_ID          int IDENTITY(1,1),
        Persoon_ID      int,
        L_GebNaam       varchar(max),
        L_Wachtwoord    varchar(max),

        CONSTRAINT PK_Lid PRIMARY KEY (Lid_ID),
        CONSTRAINT FK_Lid_Ref_Persoon FOREIGN KEY (Persoon_ID) REFERENCES Persoon (Persoon_ID) ON UPDATE CASCADE,
    )
    go

    CREATE TABLE Stat(
        Status_ID   int IDENTITY(1,1),
        S_Naam      varchar(max),

        CONSTRAINT PK_Stat PRIMARY KEY (Status_ID)
    )
    go

    CREATE TABLE Hangaar(
        Hangaar_ID  int IDENTITY(1,1),
        H_Naam      varchar(max),
        H_Locatie   varchar(max),

        CONSTRAINT PK_Hangaar PRIMARY KEY (Hangaar_ID)
    )
    go

    CREATE TABLE Vliegtuig(
        Vliegtuig_ID    int IDENTITY(1,1),
        Hangaar_ID      int,
        Status_ID       int,
        V_Naam          varchar(max),
        V_Type          varchar(max),

        CONSTRAINT PK_Vliegtuig PRIMARY KEY (Vliegtuig_ID),
        CONSTRAINT FK_Vliegtuig_Ref_Hangaar FOREIGN KEY (Hangaar_ID) REFERENCES Hangaar (Hangaar_ID) ON UPDATE CASCADE,
        CONSTRAINT FK_Vliegtuig_Ref_Status FOREIGN KEY (Status_ID) REFERENCES Stat (Status_ID) ON UPDATE CASCADE,
    )
    go

    CREATE TABLE Vlucht(
        Vlucht_ID       int IDENTITY(1,1),
        Lid_ID          int,
        Vliegtuig_ID    int,
        Vl_Vertrektijd  date,
        VL_Eindtijd     date,
        VL_Type         char(1),
        Vl_Notitie      varchar(max),

        CONSTRAINT PK_Vlucht PRIMARY KEY (Vlucht_ID),
        CONSTRAINT FK_Vlucht_Ref_Lid FOREIGN KEY (Lid_ID) REFERENCES Lid (Lid_ID) ON UPDATE CASCADE,
        CONSTRAINT FK_Vlucht_Ref_Vliegtuig FOREIGN KEY (Vliegtuig_ID) REFERENCES Vliegtuig (Vliegtuig_ID) ON UPDATE CASCADE,
        CONSTRAINT CHK_VL_type CHECK (VL_type = 'R' OR VL_type = 'L')

    )
    go

接下来是创建可重复使用的 DML 文件:

    use Zvcvolkel
    go

    DELETE FROM Vlucht
    DELETE FROM Medewerker
    DELETE FROM Lid
    DELETE FROM Persoon
    DELETE FROM Rol
    DELETE FROM Vliegtuig
    DELETE FROM Stat
    DELETE FROM Hangaar

    go

    INSERT INTO Rol 
    VALUES  ('Management'),
            ('Instructeur'),
            ('Technicus'),
            ('Lid'),
            ('Bartender')

    INSERT INTO Stat 
    VALUES  ('Beschikbaar'),
            ('Niet beschikbaar'),
            ('Onderhoud')

    INSERT INTO Hangaar 
    VALUES  ('Hangaar 1', 'Volkel'),
            ('Hangaar 2', 'Volkel')

    INSERT INTO Vliegtuig 
    VALUES  (1, 1, 'PH-143', 'ASK-21'),
            (1, 3, 'PH-1643', 'LS-4'),
            (2, 2, 'PH-831', 'Ka-8')

    INSERT INTO Persoon
    VALUES  (1, 'Chef', 'de Directeur', '01-01-1986', 'Eindhoven', 'M', 'IBAN7277'),
            (2, 'Piet', 'de Instructeur', '02-02-1965', 'Geldrop', 'M', 'IBAN5656'), 
            (3, 'Monica', 'de Technicus', '03-03-1958', 'Helmond', 'V', 'IBAN8579'),
            (4, 'Linda', 'het Lid', '04-04-1976', 'Deurne', 'V', 'IBAN4665'),
            (5, 'Jan', 'de Bartender', '05-05-1966', 'Venray', 'M', 'IBAN5765')

    INSERT INTO Medewerker
    VALUES  (5, 1250.00)

    INSERT INTO Lid
    VALUES  (1, 'Chefgeb', 'Chefww'),
            (2, 'Pietgeb', 'Pietww'),
            (3, 'Monicageb', 'Monicaww'),
            (4, 'Lindageb', 'Lindaww')

    INSERT INTO Vlucht
    VALUES  (2, 1, '10-04-2018 10:34:00', '10-04-2018 17:34:00', 'R', 'Geen notitie')

它在第一个 运行 上完美运行,但是当我再次 运行 它再次添加行时,它会因为自动递增而覆盖 ID。当我再次 运行 查询时,Rol_ID 变成 6 - 7 - 8 - 9 - 10 而不是 1 - 2 - 3 - 4 - 5!每次我 运行 ID 增加时,由于第一行的 Delete 语句,它应该再次从 1 开始。

有人知道我在这里遗漏了什么吗?

我觉得你可以用

DBCC CHECKIDENT ('TableName', RESEED, 0)

对于所有使用 IDENTITY 列的表。

您需要重置身份计数器

DBCC CHECKIDENT 管理命令用于重置身份计数器。命令语法为:

DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])

例如

DBCC CHECKIDENT ('Vliegtuig', RESEED, 0);

开始

是的,您需要使用以下语句将所有表的身份计数器重置为 0。

DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])