2009-09-09 19 views
31

Esta es una pregunta de seguimiento de la que pregunté here.¿Pueden existir restricciones con el mismo nombre en un DB?

¿Pueden las restricciones en un DB tener el mismo nombre?

Decir que tengo:

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 
) 

Es esto permisible? ¿Depende del DBMS (estoy en SQL Server 2005)? Si no es permitido, ¿alguien tiene alguna sugerencia sobre cómo solucionarlo?

Respuesta

37

No: una restricción es también un objeto de base de datos y, por lo tanto, su nombre debe ser único.

Intenta agregar, p. el nombre de la tabla para su restricción, de esa manera será único.

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 
) 

básicamente Utilizamos "FK _" (tabla secundaria) _ (tabla principal)" para nombrar las limitaciones y son bastante contentos con esta convención.

Información MSDN

Eso los nombres de restricción deben ser exclusivos del esquema (es decir, dos esquemas diferentes en la misma base de datos pueden contener una restricción con el mismo nombre). No es necesario documentar explícitamente. Más bien, debe asumir que los identificadores de objetos de base de datos deben ser únicos dentro del esquema salvo que se especifique lo contrario erwise. Por lo tanto, el nombre de la restricción es defined como:

Es el nombre de la restricción. Los nombres de restricción deben seguir las reglas para los identificadores, excepto que el nombre no puede comenzar con un signo de número (#). Si no se proporciona constraint_name, se asigna un nombre generado por el sistema a la restricción.

comparar esto con el nombre de un index:

es el nombre del índice. Los nombres de índice deben ser únicos dentro de una tabla o vista, pero no deben ser únicos dentro de una base de datos. Los nombres de índice deben seguir las reglas de los identificadores.

que limita explícitamente el alcance del identificador.

+0

+1: Usamos las primeras letras de las palabras que hacen que el nombre de la tabla sea un prefijo. –

7

Siempre me sorprendió por qué nombres de restricciones deben ser únicos en la base de datos, ya que parecen estar asociados con tablas.

Luego leí acerca de la restricción ASSERTION de SQL-99, que es como una restricción de verificación, pero existe aparte de cualquier tabla individual. Las condiciones declaradas en una aserción deben cumplirse consistentemente como cualquier otra restricción, pero la aserción puede hacer referencia a múltiples tablas.

AFAIK ningún proveedor de SQL implementa ASSERTION restricciones. Pero esto ayuda a explicar por qué los nombres de restricciones tienen alcance de toda la base de datos.

+1

bien, incluso si la restricción de aserción no está implementada: ¿querría Raelly tener tres restricciones de clave externa con el mismo nombre? Si obtienes un error de violación FK que indica el nombre del FK, ¿cómo sabes cuál de los tres es realmente? Creo que imponer nombres únicos de restricciones es "Good Thing (tm)" :-) –

+0

Sí, definitivamente. Estaba haciendo el punto de que "está en el estándar ANSI SQL de esa manera", pero su punto es aún más práctico. –

0

Una buena práctica es crear nombres de índices y restricciones especificando el nombre de la tabla al comienzo. Hay 2 enfoques, con índice/tipo de restricción al principio o al final), p. Ej.

UQ_TableName_FieldName 

o

TableName_FieldName_UQ 

nombres claves extranjeras también deben contener los nombres de referencia de la tabla/campo (s).

Una de las buenas convenciones de nomenclatura es dar nombres de tabla en forma de FullName_3LetterUniqueAlias, por ej.

Employers_EMR 
Employees_EMP 
BankAccounts_BNA 
Banks_BNK 

Esta darle oportunidad de utilizar alias "predefinidos" en las consultas que mejora la legibilidad y también hace denominación de claves extranjeras más fácil, como:

EMPEMR_EmployerCode_FK 
BNKEMR_EmployerCode_FK 
16

Las otras respuestas son todos buenos, pero pensé que 'd añadir una respuesta a la pregunta del título, es decir, 'puede haber limitaciones con el mismo nombre en un DB?'

la respuesta para MS SQL Server es sí - pero sólo en tanto que las restricciones están en diferentes sch emas. Los nombres de restricción deben ser únicos dentro de un esquema.

1

¿Depende del DBMS (estoy en SQL Server 2005)?

Sí, aparentemente depende del DBMS.

Otras respuestas dicen que no está permitido, pero tengo una base de datos MS SQL CE ("Edición Compacta") en la que creé accidentalmente dos constraints FK, en dos tablas, con el mismo nombre de restricción.

0

Depende del DBMS.

Por ejemplo en PostgreSQL, la respuesta es :

Debido a PostgreSQL no requiere nombres de restricción que ser único dentro de un esquema (pero sólo por tabla), es posible que Hay más de una coincidencia para un nombre de restricción especificado.

Fuente: https://www.postgresql.org/docs/current/static/sql-set-constraints.html

que he visto claves externas nombres de restricción es igual en 2 tablas diferentes dentro del mismo esquema.

Cuestiones relacionadas