使用MySQL创建带有唯一约束的表

7

我刚开始学习SQL语法,正在尝试创建一个表。

这是我的错误信息:

#1064 - 您的SQL语法有误,请检查与您的MySQL服务器版本对应的手册以获取正确的语法,在第7行附近出现了错误:CONSTRAINT uc_people_2nd UNIQUE (lastName,firstName), ) ENGINE = INNODB

这是我的SQL语句:

CREATE TABLE `people` (
`_id` INT NOT NULL AUTO_INCREMENT,
`lastName` TEXT NOT NULL,
`firstName` TEXT NOT NULL,
`JSON` TEXT NOT NULL,
PRIMARY KEY(_id)
CONSTRAINT uc_people_2nd UNIQUE (lastName,firstName),
) ENGINE = INNODB;

我尝试在我正在开发的NodeDB中进行此操作,然后是在PHPMyAdmin。

1个回答

17

修正逗号并将名称更改为varchar()

CREATE TABLE `people` (
`_id` INT NOT NULL AUTO_INCREMENT,
`lastName` varchar(255) NOT NULL,
`firstName` varchar(255) NOT NULL,
`JSON` TEXT NOT NULL,
PRIMARY KEY(_id),
CONSTRAINT uc_people_2nd UNIQUE (lastName, firstName)
) ENGINE = INNODB;

这在SQL Fiddle上可以运行。

请注意,您不必为唯一约束条件命名。您还可以删除constraint关键字,因此以下内容也可以正常工作:

UNIQUE (lastName, firstName)

编辑:

text 数据类型在这个页面上与其他“大对象”一起描述,详情请参阅这里。这些是特殊类型,长度任意(想象一下几兆字节)。当它们用于索引时有限制。特别地,它们需要长度前缀。因此,您不能声明一个text 列是唯一的,仅能在前N个字符中(最多约1000个字符)做到唯一。

对于名称而言,那就是过度杀伤力了。MySQL支持各种字符串类型。最有用的是varchar()。这些适合用于名称字段。它们可以轻松使用索引。MySQL还支持对它们进行大量的函数操作。

换句话说,如果您不知道text是什么,您就不需要它。学习和使用varchar()char()(或者如果您需要支持国家字符集,则使用nvarchar()nchar())。忘掉text。如果哪一天您需要它,您会重新发现它。


varchar和text有什么区别? - Arlen Beiler
1
这个问题太宽泛了,无法在评论中回答。请阅读手册中的数据类型章节,特别是String types部分。 - VMai
@ArlenBeiler - 顺便说一下,_names_并不是真正的唯一标识符。想想'John Smith'。我个人觉得这种限制有点可疑。 - Clockwork-Muse
一般而言是这样的。但在我的情况下,它们是不同的。如果两个人有相同的名字,我们会将其他 ID 添加到组合中,例如他们父亲的名字。例如 'John (Dave) Smith'。我正在构建一个主日学校出勤追踪器,因此我们希望有一些方法来保持事物的分离。 - Arlen Beiler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接