哪些是做外键的正确方法?

时间:2015-06-30 23:47:53

标签: sql database database-design sqlite

所以,我正在尝试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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

我想我找到了解决方案。

我这样做:

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);