Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can there be constraints with the same name in a DB?

This is a follow-on question from the one I asked here.

Can constraints in a DB have the same name?

Say I have:

CREATE TABLE Employer (     EmployerCode    VARCHAR(20)    PRIMARY KEY,     Address         VARCHAR(100)   NULL )   CREATE TABLE Employee (     EmployeeID      INT            PRIMARY KEY,     EmployerCode    VARCHAR(20)    NOT NULL,     CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer )   CREATE TABLE BankAccount (     BankAccountID   INT            PRIMARY KEY,     EmployerCode    VARCHAR(20)    NOT NULL,     Amount          MONEY          NOT NULL,     CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer ) 

Is this allowable? Does it depend on the DBMS (I'm on SQL Server 2005)? If it is not allowable, does anyone have any suggestions on how to work around it?

like image 389
Andrew Avatar asked Sep 09 '09 05:09

Andrew


People also ask

Can two objects have same name in database?

Within a namespace, no two objects can have the same name.

Do constraint names matter?

By naming the constraints you can differentiate violations of them. This is not only useful for admins and developers, but your program can also use the constraint names. This is much more robust than trying to parse the error message.

Can two foreign keys have the same name?

There is no requirement that the names of the foreign key and the referenced unique or primary key column are the same. They can be different names.

Can a foreign key be the same name as a primary key?

1) Name of foreign key can be different than the name of primary key it represent in other table. For example in our Employee and Department relationship, Primary key in Department table is dept_id and we have used same name in Employee table to create foreign key.


1 Answers

No - a constraint is a database object as well, and thus its name needs to be unique.

Try adding e.g. the table name to your constraint, that way it'll be unique.

CREATE TABLE BankAccount (     BankAccountID   INT            PRIMARY KEY,     EmployerCode    VARCHAR(20)    NOT NULL,     Amount          MONEY          NOT NULL,     CONSTRAINT FK_BankAccount_Employer          FOREIGN KEY (EmployerCode) REFERENCES Employer ) 

We basically use "FK_"(child table)_(parent table)" to name the constraints and are quite happy with this naming convention.

Information from MSDN

That constraint names have to be unique to the schema (ie. two different schemas in the same database can both contain a constraint with the same name) is not explicitly documented. Rather you need to assume the identifiers of database objects must be unique within the containing schema unless specified otherwise. So the constraint name is defined as:

Is the name of the constraint. Constraint names must follow the rules for identifiers, except that the name cannot start with a number sign (#). If constraint_name is not supplied, a system-generated name is assigned to the constraint.

Compare this to the name of an index:

Is the name of the index. Index names must be unique within a table or view but do not have to be unique within a database. Index names must follow the rules of identifiers.

which explicitly narrows the scope of the identifier.

like image 128
marc_s Avatar answered Sep 22 '22 22:09

marc_s