Domanda

I'm currently designing a database to be implemented in SQL Server. I created the following tables without problem:

CREATE TABLE [Client] (
  [ClientId] INT NOT NULL,
  [Name] VARCHAR(45) NOT NULL,
  [IsEnabled] BIT NOT NULL DEFAULT 1,
  CONSTRAINT PK_TCASystem PRIMARY KEY CLUSTERED (
ClientId
 )
);

 CREATE TABLE [Configuration] (
  [ConfigId] INT NOT NULL,
  [ClientId] INT NOT NULL,
  [Name] VARCHAR(45) NOT NULL,
  CONSTRAINT PK_Configuration PRIMARY KEY CLUSTERED (
    ConfigId, ClientId
  ),
  CONSTRAINT "FK_SystemConfiguration" FOREIGN KEY 
  (
    ClientId
  ) REFERENCES [Client] (
    ClientId
  )
 );

However, when I tried to add this one:

CREATE TABLE [Mail] (
   [MailId] INT NOT NULL,
   [ConfigId] INT NOT NULL,
   [Recipient] VARCHAR(500) NOT NULL,
   [Sender] VARCHAR(50) NOT NULL,
   [Subject] VARCHAR(250) NOT NULL,
   [Message] TEXT NULL,

   CONSTRAINT PK_Mail PRIMARY KEY CLUSTERED (
    MailId, ConfigId
   ),
   CONSTRAINT "FK_ConfigurationMail" FOREIGN KEY 
   (
        ConfigId
   ) REFERENCES [Configuration] (
        ConfigId
   )
);

I got an error saying that There are no primary or candidate keys in the referenced table 'Configuration' that match the referencing column list in the foreign key 'FK_ConfigurationMail'. I believe this is because the constraint is trying to reference ConfigId, only one half of the composite key, and for this to work I'd need to reference the ClientId too, is that correct?

But my problem is that I first did the design for this database in MYSQL Workbench, and there I indicated that Configuration and Mail, as well as Client and Configuration, have a 1:n identifying relationship (because a Mail instance cannot be created if there isn't a Configuration instance first, and at the same time a Configuration instance cannot exist without having being assigned to a Client first), and as such it created the composite keys for Configuration and Mail. You can see a picture of that here.

So my question is, how can I translate this identifying relationship to SQL Server? Or is that not possible?

EDIT: As suggested I will remove the composite keys from the Configuration table, albeit my question still stands: If I have a 1:n identifying relationship where one of the tables involved uses composite keys, how can I display this on SQL Server? Or is such a case never supposed to happen?

2ND EDIT: To anyone who might come across this question, this post is well worth a read. Cleared up all my confusion in the matter.

È stato utile?

Soluzione

Foreign key must reference PK (the entire PK, not portion of PK) or unique index. So add this between create table [Configuration] and [Mail].

CREATE UNIQUE NONCLUSTERED INDEX [UX_Configuration] ON [Configuration] ( [ConfigId] ASC )

Check out at sql fiddle for the whole working script: http://www.sqlfiddle.com/#!3/8877f

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top