1

データベースに2つのテーブルがあり、マスターテーブルには「ID」という名前のフィールドがあり、「uniqueidentifier」データ型があり、詳細テーブルには「nvarchar」データ型の「MID」という名前のフィールドがあり、マスターテーブルフィールド「ID」を保存しますその中の価値

これらのテーブル間に主従関係を追加したいのですが、実行したいときに次のようなメッセージが表示されます: 「列 "..." の次のデータ型のプロパティは、"..." の列と一致しません」

「MID」データ型を「一意識別子」に設定することはできません!

MS-Access では可能ですが、MS-SQLServer 2008 でこれを行うにはどうすればよいですか?!

前にありがとう...

4

2 に答える 2

2

SQL Server では、外部キーを作成するために列のデータ型が一致する必要があるため、これを簡単に行うことはできません。ただし、(やや厄介で複雑な) 回避策があります。SQL Server では、UNIQUE 制約を持つ任意の列に対して外部キーを作成できます。したがって、次の手順を実行できます。

オプション1

(コメントで提案されているように、より良い)

ALTER TABLE dbo.Table1 ADD ID_Text AS CAST(ID AS varchar(36)) PERSISTED UNIQUE
GO

次に、この列に外部キーを設定できます。

オプション 2

(私のオリジナル、あまり良くない)

ALTER TABLE dbo.Table1 ADD ID_Text varchar(36) NULL
GO

UPDATE dbo.Table1 SET ID_Text = CAST(ID AS varchar(36))
GO

ALTER TABLE dbo.Table1 ALTER COLUMN ID_Text varchar(36) NOT NULL
GO

ALTER TABLE dbo.Table1 ADD CONSTRAINT U_ID_Text UNIQUE (ID_Text)
GO

次に、データが取り込まれたままであることを確認するには、挿入時にトリガーID_Textが必要です。INSTEAD OF

CREATE TRIGGER TI_Table1_ID_Text
ON dbo.Table1
INSTEAD OF INSERT
AS

        SET NOCOUNT ON

        INSERT  dbo.Table1
                (ID, ID_Text, OtherFields)
        SELECT  ID, CAST(ID AS varchar(36)), OtherFields
        FROM    inserted

        SET NOCOUNT OFF

GO

OtherFieldsここで、 ...えー...他のフィールドに置き換えます。

次に、列から新しいフィールドへID_Textの外部キーを作成できるという事実を除けば、新しいフィールドを忘れることができます。MID

于 2012-07-03T12:12:28.857 に答える
1

カスタム制約を作成できます。まず、制約をチェックする関数を作成します。

CREATE FUNCTION udf_CheckCustomConstraint
(
    @ForeignKeyValue nvarchar
)
RETURNS bit
AS
BEGIN
    DECLARE @Result bit
    SELECT @Result = CONVERT(bit, COUNT(*))
    FROM MasterTable
    WHERE ID = @ForeignKeyValue

    RETURN @Result
END

次に、外部キーテーブルに制約を作成します。

ALTER TABLE [DetailTable]
    ADD CONSTRAINT [ConstraintName] CHECK ([udf_CheckCustomConstraint]([MID])=(1))

お役に立てれば。

于 2012-07-03T12:31:50.040 に答える