带有复合主键的表,其中一个字段是自增的

2 投票
3 回答
1534 浏览
提问于 2025-04-16 10:27

我正在使用表约束来创建一个复合主键,我想让 id 字段自动增加,这可能吗?或者有什么其他的选择?

   CREATE TABLE IF NOT EXISTS atable(
        id          INTEGER NOT NULL, --I want to autoincrement this one
        name     TEXT NOT NULL,
        anotherCol  TEXT,

    PRIMARY KEY(id, name));

3 个回答

0

在我看来,提问者似乎并不想让名字是唯一的。(不过我可能错了。)无论如何,你可以:

  1. 通过使用 INTEGER PRIMARY KEY 并在该列插入 NULL 来获取一个自动递增的整数;
  2. 通过在 (id, name) 上使用 UNIQUE 约束来声明一个超级键。

超级键就是一个候选键(在这个情况下是主键)加上一个或多个列。

CREATE TABLE yourtable(
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    CONSTRAINT superkey UNIQUE (id, name)
);

如果你通过使用 PRAGMA foreign_keys = on; 来开启外键支持,那么超级键可以作为其他表中外键约束的目标。不过我不确定这是否是你想要的。

0

这里有一个链接,指向SQLite的常见问题解答页面,你问的关于如何让整数主键自动增加的问题排在第一位。 http://www.sqlite.org/faq.html#q1

下面是你SQL语句稍微修改过的版本:

 CREATE TABLE IF NOT EXISTS atable(
    id          INTEGER PRIMARY KEY, -- use NULL for this column on INSERT to autoinc
    name        TEXT NOT NULL,
    anotherCol  TEXT);

然后,按照duffymo和Kaleb的建议,在NAME上创建一个唯一索引。

5

不,只有一个主键:就是id和name的组合。

如果你是想让id成为主键,而name成为一个有索引的备用键,那我建议你给name设置一个唯一约束,并把id设为主键。

撰写回答