実際にはスタッフィーなツリーのセットがあります。上部には、顧客と、その請求書と、請求書の詳細レコードがあります。 (実際には、これらのテーブルはすべて顧客を参照していますが、その原則は3つのテーブルだけに適用する必要があります)共通の祖先を持つ制約のあるレコードのセットをコピーする
私は、顧客とすべてのレコードをコピーしてその顧客はすべてのレコードのすべての単一フィールドを列挙する必要はありません。すべてがそれの上にあるものに制限された外部キーであり、テーブルのほとんどは自動増分IDフィールドを持っています。
以下は、データベースを設定するためのT-SQLスクリプトです。はい、それは面倒ですが、それは完全です。
CREATE TABLE [dbo].[Customer](
[custID] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ([custID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Invoice](
[invoiceNum] [int] IDENTITY(1,1) NOT NULL,
[custID] [int] NOT NULL,
[Description] [varchar](50) NOT NULL,
CONSTRAINT [PK_Invoice] PRIMARY KEY CLUSTERED ([invoiceNum] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
CREATE TABLE [dbo].[InvoiceDetail](
[invoiceNum] [int] NOT NULL,
[sequence] [smallint] NOT NULL,
[description] [varchar](50) NOT NULL,
[price] [decimal](10, 2) NOT NULL CONSTRAINT [DF_InvoiceDetail_price] DEFAULT ((0.0)),
CONSTRAINT [PK_InvoiceDetail] PRIMARY KEY CLUSTERED ([invoiceNum] ASC, [sequence] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Invoice] WITH CHECK ADD CONSTRAINT [FK_Invoice_Customer]
FOREIGN KEY([custID])
REFERENCES [dbo].[Customer] ([custID])
GO
ALTER TABLE [dbo].[Invoice] CHECK CONSTRAINT [FK_Invoice_Customer]
GO
ALTER TABLE [dbo].[InvoiceDetail] WITH CHECK ADD CONSTRAINT [FK_InvoiceDetail_Invoice]
FOREIGN KEY([invoiceNum])
REFERENCES [dbo].[Invoice] ([invoiceNum])
GO
ALTER TABLE [dbo].[InvoiceDetail] CHECK CONSTRAINT [FK_InvoiceDetail_Invoice]
declare @id int;
declare @custid int;
insert into Customer values ('Bob');
set @custid = @@IDENTITY;
insert into Invoice values (@custid, 'Little Purchase');
set @id = @@IDENTITY;
insert into InvoiceDetail values (@id, 1, 'Small Stuff', 1.98);
insert into InvoiceDetail values (@id, 2, 'More Small Stuff', 0.25);
insert into Invoice values (@custid, 'Medium Purchase');
set @id = @@IDENTITY;
insert into InvoiceDetail values (@id, 1, 'Stuff', 11.95);
insert into InvoiceDetail values (@id, 2, 'More Stuff', 10.66);
insert into Customer values ('Sally');
set @custid = @@IDENTITY;
insert into Invoice values (@custid, 'Big Purchase');
set @id = @@IDENTITY;
insert into InvoiceDetail values (@id, 1, 'BIG Stuff', 100.00);
insert into InvoiceDetail values (@id, 2, 'Larger Stuff', 99.95);
だから、私は何をしたい、このデータベースに「ボブ」のコピーを作成し、すべてのテーブルのために、各列を指定するの面倒をすべてずに「BOB2」と呼んでいます。私は可能ですが、実際の世界ではたくさんのコラムがあります。
もう1つの問題は、それぞれの請求書を取得するために明示的なループを作成する必要があるということです。請求書の詳細を記入するには、前の請求書挿入からIDが必要です。
私はC#の "コピー"プログラムを持っていますが、データベース内でこれをすべて実行したいと思います。素朴な実装は、どこでもループとカーソルを持つトランザクションSQLストアドプロシージャです。
は賢いですかこれらの問題のいずれか(両方ではない場合)を回避する方法はありますか?
本当に「得意先」と「請求書」はありません。パブリックフォーラムに実際のスキーマを投稿することは不適切です。彼らはしかし、実際のデータベースを模倣する。 –