2011-11-14 18 views
0

は、次のように生成された:SQL Server 2008の - 私は、SQL Server 2008でSQLデータベースを持っているFK制約のある行の削除

CREATE TABLE Client ( 
    ID bigint, 
    Code varchar(50), 
    ClientID int NOT NULL 
); 
ALTER TABLE Client 
    ADD CONSTRAINT PK_Client PRIMARY KEY CLUSTERED (ClientID); 

CREATE TABLE Company ( 
    ID bigint, 
    Description nvarchar(100), 
    SubsidiaryOf bigint, 
    companyID int NOT NULL, 
    FK_Client_Company int, 
    PK_Company int 
); 
ALTER TABLE Company 
    ADD CONSTRAINT PK_Company PRIMARY KEY CLUSTERED (companyID); 

ALTER TABLE Company 
    ADD CONSTRAINT (ID = ID) FOREIGN KEY (FK_Client_Company) 
     REFERENCES Client (ClientID); 

ALTER TABLE Company 
    ADD CONSTRAINT (SubsidiaryOf = ID) FOREIGN KEY (PK_Company) 
     REFERENCES Company (companyID); 

CREATE TABLE ContactData ( 
    ID bigint, 
    LocationID bigint, 
    Contact nvarchar(50), 
    contactDataID int NOT NULL, 
    PK_Location int 
); 
ALTER TABLE ContactData 
    ADD CONSTRAINT PK_ContactData PRIMARY KEY CLUSTERED (contactDataID); 

ALTER TABLE ContactData 
    ADD CONSTRAINT (LocationID = ID) FOREIGN KEY (PK_Location) 
     REFERENCES Location (locationID); 


CREATE TABLE Location ( 
    ID bigint, 
    CompanyID bigint, 
    Country nvarchar(50), 
    ZIPCode nvarchar(50), 
    locationID int NOT NULL, 
    PK_Company int 
); 
ALTER TABLE Location 
    ADD CONSTRAINT PK_Location PRIMARY KEY CLUSTERED (locationID); 

ALTER TABLE Location 
    ADD CONSTRAINT (CompanyID = ID) FOREIGN KEY (PK_Company) 
     REFERENCES Company (companyID); 

をとIDを持つすべての企業を削除したいと思います> 140000(関連する行とで他のテーブル)。 1つのトランザクションでINNER JOINの組み合わせを試しましたが、FK_Client_Company制約にはまだ問題があります。誰でも助けてくれますか?

もう1つ - 私は何も追加できません/ DB構造/制約を変更します。これはクエリベースのソリューションでなければなりません。

+1

参照:http://stackoverflow.com/questions/6260688/sql-server-cascade-delete – Eddy

+2

**非常に奇妙な**外部キー制約名..... –

答えて

0

まず、かなり 『必ずそれが答えだ

私は
delete company where id > 140000 

あなたは、会社のテーブルにDELETEステートメントを実行することができるはずその後クライアント

delete client where id in (select fk_client_company from company where id > 140000) 

』を、これらの企業を削除しますあなたの命名計画がちょっと奇妙に思えるので、私は100%肯定的ではありません。私は、company.fk_client_company = client.idと仮定しています。

+0

あなたは'クエリベース'ソリューション私はあなたがクエリでデータベースのスキーマを変更することができ、それを行うためのアクセス権がないと言っていることを理解していると仮定しています。実際にアクセスできる場合は、「アクティブ」フィールドを会社のテーブルに追加し、その企業を非アクティブとしてマークすることをお勧めします。これは可能な解決策ではないかもしれません。新しい「アクティブ」フィールドでフィルタリングするために変更できないアプリケーションで作業しているのかもしれませんが、ただそこに投げ込もうとしています。 –

+0

ありがとう!私はこのコードをすべてBEGIN TRANとCOMMIT TRANに入れました –

+0

ああ、私はただ何かを忘れてしまったことに気付きました。 "(select fk_client_company where id> 140000)"は "(fk_client_companyを会社のどこから選択するかはid> 140000)"にする必要があります。私は答えでそれを修正します。 –