Si tengo dos relaciones en una base de datos, como esta:

CREATE TABLE Courses (
  CourseID int NOT NULL PRIMARY KEY,
  Course VARCHAR(63) NOT NULL UNIQUE,
  Code CHAR(4) NOT NULL UNIQUE
);

CREATE TABLE BookCourses (
  EntryID int NOT NULL PRIMARY KEY,
  BookID int NOT NULL,
  Course CHAR(4) NOT NULL,
  CourseNum CHAR(3) NOT NULL,
  CourseSec CHAR(1) NOT NULL
);

y puedo establecer una relación de clave externa entre los dos, como este:

ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;

A continuación, puede ver que el Course atributo en el BookCourses relación hace referencia a la Code atributo en el Courses relación.

Mi pregunta es cuando la eliminación se produce en cualquiera de las dos relaciones, que no la eliminación en cascada? Si puedo borrar una tupla en la Courses relación, va a eliminar toda referencia a las tuplas en la BookCourses relación, o es al revés?

  • Uno sólo se pregunta por qué el Categories tabla tiene un CourseID como los de Clave Principal, mientras que el Courses tabla tiene la EntryID. Usted en serio la necesidad de repensar su nomenclatura opciones.
  • Por favor usuario apropiado nombres de columna para evitar la confusión y la clara estructura DB.
InformationsquelleAutor Oliver Spryn | 2012-11-18

2 Comentarios

  1. 179

    Cascada de trabajo cuando se elimina algo en la mesa Courses. Ningún registro en la tabla BookCourses que tiene referencia a la tabla Courses serán eliminados automáticamente.

    Pero cuando intenta eliminar en la tabla BookCourses sólo la tabla en sí se ve afectado y no en el Courses

    pregunta: ¿por qué tienes CourseID en la tabla de la Categoría?

    Tal vez debería reestructurar su esquema en esto,

    CREATE TABLE Categories 
    (
      Code CHAR(4) NOT NULL PRIMARY KEY,
      CategoryName VARCHAR(63) NOT NULL UNIQUE
    );
    
    CREATE TABLE Courses 
    (
      CourseID INT NOT NULL PRIMARY KEY,
      BookID INT NOT NULL,
      CatCode CHAR(4) NOT NULL,
      CourseNum CHAR(3) NOT NULL,
      CourseSec CHAR(1) NOT NULL,
    );
    
    ALTER TABLE Courses
    ADD FOREIGN KEY (CatCode)
    REFERENCES Categories(Code)
    ON DELETE CASCADE;
    • Genial!!! Gracias. seguimiento de la respuesta: Porque yo camino sobre el pensamiento de ella. Fija ahora… y en mi DB
    • Esta respuesta tiene diferentes nombres de tabla y de las estructuras de la pregunta… por lo que es mucho menos útil.
    • No estoy de acuerdo de que esta respuesta no es útil. Es que si lees lo que dice. Yo, sin embargo de acuerdo en que la respuesta podría ser formateado por lo que es claro lo que es parte de la respuesta real y lo que es otra discusión. El esquema se ha destacado anteriormente está relacionado con el pregunta, pero no la respuesta a la pregunta.
  2. 15

    Aquí es un simple ejemplo para los demás, pásate por este viejo post, pero es confundido por el ejemplo de la pregunta:

    De entrega -> Paquete (Una -> Muchos)

    CREATE TABLE Delivery(
        Id INT IDENTITY PRIMARY KEY,
        NoteNumber NVARCHAR(255) NOT NULL
    )
    
    CREATE TABLE Package(
        Id INT IDENTITY PRIMARY KEY,
        Status INT NOT NULL DEFAULT 0,
        Delivery_Id INT NOT NULL,
        CONSTRAINT FK_Package_Delivery_Id FOREIGN KEY (Delivery_Id) REFERENCES Delivery (Id) ON DELETE CASCADE
    )

    La entrada con la clave externa Delivery_Id (Paquete) se elimina con la entidad de referencia en el FK relación de Entrega ().

    Así que cuando un Parto se elimina los Paquetes que hacen referencia a él también se eliminarán. Si un Paquete se elimina nada de lo que sucede con cualquier entregas.

    • Gracias por el ejemplo fácil de entender!

Dejar respuesta

Please enter your comment!
Please enter your name here