1
create table Linq_TB
{
   url_id int NOTNULL,
   Pg_Name nvarchar(50) NOTNULL,
   URL nvarchar(50) NUTNULL,

   CONSTRAINT Linq_id PRIMARY KEY (url_id,DBCC Checkident(Linq_TB,RESEED,0) case url_id not in(select URL_Id from URL_TB ))
}

主キーであるテーブルを作成し、1 から開始して 1 ずつインクリメントする ID と IDLinq_idの両方から値を取得します。は外部キーです。たとえば、が 1の場合、 は 11、12、13、... となり、変更時に IDもリセットしたいと考えています。url_idurl_idurl_idlinq_idlinq_idurl_id

クエリは何ですか?上記のクエリが機能しません。なぜですか?

前もって感謝します

4

2 に答える 2

0

これは、次の表とトリガー定義を使用して実行できます。

CREATE TABLE Linq_TB
(
   url_id INT NOT NULL,
   Linq_id INT NOT NULL,
   Pg_Name NVARCHAR(50) NOT NULL,
   URL NVARCHAR(50) NOT NULL,

   CONSTRAINT PK_Link_TB PRIMARY KEY (url_id, Linq_id),
   CONSTRAINT FK_URL_TB_URL_ID FOREIGN KEY (url_id) REFERENCES URL_TB (url_id)
)
GO

CREATE TRIGGER tr_Linq_TB_InsertUpdate
ON Linq_TB
INSTEAD OF INSERT
AS
    INSERT INTO Linq_TB
    SELECT i.url_id,
        ISNULL(tb.Linq_id, 0)
            + row_number() over (partition by i.url_id order by (select 1)),
        i.Pg_Name, i.URL
    FROM inserted i
    LEFT OUTER JOIN 
            (
            SELECT url_id, MAX(Linq_ID) Linq_id
            FROM Linq_TB
            GROUP BY url_id
            ) tb ON i.url_id = tb.url_id
GO

CREATE TABLE、列と制約を定義します。Linq_idまた、トリガーは、各 の列にシーケンス値を生成するロジックを作成しますurl_id

トリガーのロジックは完全ではないことに注意してください。いくつかの問題は解決されていません: 1)url_id行の変更がトリガーによって更新されないLink_id、2) 行を削除するとLinq_TB列の順序にギャップが生じる。

于 2012-12-29T20:03:27.673 に答える
0

制約には条件が含まれており、実行されるコードは含まれていません。タスクにストアド プロシージャを使用することと、独自の ID 割り当て方法を使用することを検討する必要があります。

ただし、主キーを「きれいに」またはフォーマットすることは一般的な方法ではありません。実際の利点はないためです (おそらくデバッグ目的を除いて)。

url_ID が変更されるたびに DBCC を実行することはお勧めしません。これは、パフォーマンスに大きな悪影響を及ぼします。

IDはそのままにしませんか?

于 2012-12-29T11:47:05.887 に答える