1

特定のログからデータを自動的に取得するテーブルがいくつかあります。たとえば、私のテーブルが2つの列で構成されているとします。

Country | someData
--------|---------
USA     | 123
Canada  | 4545
Mexico  | 4363
USA     | 3434
...

現在、Country列で多くの繰り返しがあるので、Countriesの別のテーブルで外部キーを使用するのは理にかなっていますが、残念ながら、データがテーブルにアップロードされる方法では、それを実現できません。データを挿入するプログラムは国の文字列を挿入しますが、それを変更することはできません(INSERT INTO table VALUES('USA'、3232)など)

同じ文字列を複数回格納しないように、テーブルが何らかの関係を自動的に維持する方法があるかどうか疑問に思いました。

ありがとう

4

3 に答える 3

0

たった今学んだように、これがベストプラクティスに従っていることを保証することはできませんが、時々必要になり、これを学びたいと思っていました.トリガーの代わりに。

create table Country (
     id int primary key not null identity(1,1)
    ,name varchar(10)
)
go

create table Item (
     id int primary key not null identity(1,1)
    ,country_id int references Country(id)
    ,data varchar(100)
)
go

create view ItemView as
select C.name, I.data
from Item I inner join Country C on I.country_id = C.id
go

create trigger tr_Item_IOI on ItemView
instead of insert as begin

    set nocount on

      -- add the country if it does not exist
    if(not exists (select C.id from Country C inner join inserted I on C.name = I.name))
         insert into Country select distinct name from inserted

      -- insert an item using the country id for the inserted country name
    insert into Item (country_id, data)
    select C.id, I.data
    from Country C inner join inserted I on C.name = I.name

end
go

insert into ItemView values 
     ('USA', '123')
    ,('Canada', '4545')
    ,('Mexico', '4363')
    ,('USA', '3434')
go

select * from ItemView
select * from Country
select * from Item

ここに画像の説明を入力

于 2012-04-13T00:00:35.333 に答える
0

INSERT TRIGGER に任せてください。

シナリオ A)

データが挿入されるテーブルには 3 つの列があります

CountryID INT NULL,
Country VARCHAR(50) NULL,
SomeData VARCHAR(MAX) NOT NULL

アップローダーはINSERT INTO MyTable(Country, SameData) VALUES(...)

あなたのINSERT TRIGGERは

  • insertedテーブルのすべての行
  • 別の (参照された) テーブルで一致する CountryID (外部キー) を見つける
  • UPDATE SET一致した外部キ​​ーを持つ CountryID
  • UPDATE SET Country = NULL空間をきれいにする

シナリオ B)

2 つのテーブル

アップローダ用テーブル

Country VARCHAR(50) NOT NULL,
SomeData VARCHAR(MAX) NOT NULL

対象表

CountryID INT NOT NULL,
SomeData VARCHAR(MAX)

あなたのINSERT TRIGGERは

  • insertedテーブルのすべての行
  • 一致した外部キ​​ーを使用してターゲットテーブルに書き換えます

また、(従来の AFTER INSERT TRIGGER に対して)上記のシナリオを試してみてくださいINSTEAD OF INSERT TRIGGER。そのため、Country 列は DB に書き込まれることさえありません。その場で CountryID に「変換」されます。シナリオ B では、アップローダーのテーブルは実際にはビューである可能性があります (アップローダーがビューに挿入し、挿入トリガーの代わりに作業を行います)。次の例を参照してください: http://msdn.microsoft.com/en-us/library/ms175089.aspx

于 2012-04-12T23:20:51.390 に答える
-1

この質問がわかりません。国のテーブルを 1 つ持つことができ、テキスト表現をキーとして使用できます。ID 番号 (int、bigint など) である必要はありません。このテーブルには、それぞれの国 (米国、カナダ、メキシコ) のインスタンスが 1 つあります。

あなたの関係にはsomeData、たとえば USA の複数のエントリを含めることができる を格納する別のテーブルがあります。利点は、countries テーブルにオブジェクト (この場合は国) に関するより多くの列を含めることができることです。

于 2012-04-12T19:32:46.107 に答える