【问题标题】:Which of these is the right way to do foreign keys?以下哪一个是做外键的正确方法?
【发布时间】:2015-09-17 23:09:16
【问题描述】:

所以,我正在尝试 sqlite3,但我有一个关于外键和索引的问题。

这些方法中哪一种是正确的?

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist
);
CREATE INDEX trackindex ON track(trackartist);

或者这个:

CREATE TABLE student(
  SudentID INTEGER PRIMARY KEY,
  First TEXT,
  Last,
  Contact Text,
  Year INTEGER)

CREATE TABLE loan(
  StudentID INTEGER,
  ISBN INTEGER,
  out INTEGER,
  FOREIGN KEY(SudentID)
      REFERENCES student(SudentID)
      ON DELETE CASCADE
  PRIMARY KEY(StudentID, ISBN)
)
CREATE INDEX StudentID_Index ON student(StudentID)

【问题讨论】:

    标签: sql database database-design sqlite


    【解决方案1】:

    只要它有效,它就是一种风格选择。恕我直言,在列上将REFERENCES 内联编码更好,因为它更清楚:

    CREATE TABLE users (
        id INTEGER PRIMARY KEY NOT NULL,
        username TEXT NOT NULL,
        pwhash TEXT NOT NULL,
        email TEXT,
        created INTEGER NOT NULL
    );
    
    CREATE TABLE posts (
        id INTEGER PRIMARY KEY NOT NULL,
        title TEXT NOT NULL,
        description TEXT NOT NULL,
        content TEXT NOT NULL,
        id_user INTEGER NOT NULL REFERENCES users ON DELETE CASCADE
    );
    
    CREATE INDEX posts_id_user ON posts(id_user);
    

    还有。无需编写外部表的主键列 - 仅引用表就足够了(假定主键)。

    SQLFiddle

    【讨论】:

      【解决方案2】:

      我想我找到了解决办法。

      我正在这样做:

      CREATE TABLE users(
          id INTEGER PRIMARY KEY NOT NULL, /* No need for 'autoincrement' keyword */
          username TEXT NOT NULL,
          pwhash TEXT NOT NULL,
          email TEXT,
          created INTEGER NOT NULL
      );
      
      CREATE TABLE posts (
          id INTEGER PRIMARY KEY NOT NULL,
          title TEXT NOT NULL,
          description TEXT NOT NULL,
          content TEXT NOT NULL,
          id_user INTEGER NOT NULL,
          FOREIGN KEY (id_user)
              REFERENCES users(id)
              ON DELETE CASCADE
      );
      
      CREATE INDEX users_posts ON posts(id_user);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-23
        • 2017-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多