2012-02-29 17 views
7

a. Nivel de columnaLimitaciones de nivel de columna frente a nivel de tabla en el servidor sql?

GO 

CREATE TABLE Products 
(
ProductID INT CONSTRAINT pk_products_pid PRIMARY KEY, 
ProductName VARCHAR(25) 
); 

GO 

b. Tabla Nivel

CREATE TABLE Products 
(
ProductID INT, 
ProductName VARCHAR(25), 
CONSTRAINT pk_products_pid PRIMARY KEY(ProductID) 
); 
GO 

¿Hay alguna diferencia entre el nivel de la columna y las restricciones del nivel de la tabla?

Respuesta

10

No. Es solo una cuestión de gusto personal cómo aplica la restricción.

La restricción de clave primaria es solo una restricción de clave primaria; siempre se aplica a la tabla (después de todo, podría contener varias columnas; no puede estar "en el nivel de columna").

No está "en el nivel de la columna" una vez o en el "nivel de la mesa" en el otro caso - es siempre el mismo.

Sólo por diversión - también se puede crear la restricción de clave primaria una tercera vía:

(CREATE TABLE statement) 
GO 

ALTER TABLE dbo.Products 
ADD CONSTRAINT PK_Products_pid PRIMARY KEY(ProductID) 

y que de nuevo sería idéntica a las otras dos opciones que ya tiene.

+1

Gracias marc, lo tengo. –

6

Su primer ejemplo declara la restricción en la línea, la segunda no. Solo teclas simples (implican un atributo) se pueden declarar en línea, las claves compuestas (que implican varias columnas) no pueden. ¡Pero ambas son restricciones de nivel de tabla!


hay cuatro niveles lógicos de restricción:

1) de nivel de columna:

CHECK (ProductID > 0) 

2) nivel de fila:

CHECK (Product_start_date < Product_end_date) 

3) nivel de la Tabla (El siguiente el ejemplo aún no es compatible con SQL Server):

CHECK (NOT EXISTS (SELECT * 
         FROM (SELECT ROW_NUMBER() OVER (PARTITION BY ProductID) AS Tally 
           FROM Products AS P) AS DT1 
         WHERE Tally > 1)) 

4) nivel de base de datos (todavía no soportado en SQL Server):

CREATE ASSERTION EnterpriseUniqueIds 
    CHECK (NOT EXISTS (SELECT * 
          FROM ProductID AS P 
           JOIN Components AS C 
            ON C.ComponentID = P.ProductID)); 

una restricción de clave implica la comparación de diferentes filas dentro de la misma tabla, por lo tanto, es una restricción de nivel de tabla.

+0

Al menos en 2016 es un poco compatible a través de [funciones] (https://technet.microsoft.com/en-us/library/ms188258). –

+1

@PavelVoronin: el uso de una función de esta manera ha sido [problemático históricamente] (https://web.archive.org/web/20100507204302/http://consultingblogs.emc.com/davidportas/archive/2007/02/19 /Trouble-with-CHECK-Constraints.aspx). ¿Lo han arreglado en 2016? – onedaywhen

+0

No tuve la oportunidad de comprobar este escenario, sin embargo, probé el mío en el servidor de 2014. Para 2016 me refería a un año =) –

0

Hay dos maneras de definir las limitaciones de uno es a nivel de la columna y el otro es en level.one tabla puede utilizar cualquiera de estos métodos para aplicar restricciones.

Cuestiones relacionadas