首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL文本或BLOB类型不能是唯一的?

问MySQL文本或BLOB类型不能是唯一的?
EN

Stack Overflow用户
提问于 2017-10-21 13:38:38
回答 1查看 1.8K关注 0票数 0

我有一个名为users的表,下面是它的模式:

代码语言:javascript
复制
class User(db.Model):
__tablename__ = "Users"
id = db.Column(db.Integer, unique=True, primary_key=True)
firstname = db.Column(db.String(64), unique=False, nullable=False)
lastname = db.Column(db.String(64), unique=False, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(93), unique=False, nullable=False)
phone = db.Column(db.String(10), unique=True, nullable=False)
publickey = db.Column(db.Text, unique=True, nullable=True)
isitseller = db.Column(db.Boolean, unique=False, nullable=False)
money = db.Column(db.Float, unique=False, nullable=False)

def __init__(self, firstname, lastname, email, password, phone, publickey, isitseller):
    self.firstname = firstname
    self.lastname = lastname
    self.email = email
    self.password = generate_password_hash(password)
    self.phone = phone
    self.publickey = publickey
    self.isitseller = isitseller
    self.money = 0.00

def check_password(self, password):
    return check_password_hash(self.password, password)

def __repr__(self):
    return '<User %r>' % self.firstname + " " + self.lastname

但是,当我尝试用db.create_all()创建users表时,它会输出我

代码语言:javascript
复制
(_mysql_exceptions.OperationalError) (1170, "BLOB/TEXT column 'publickey' used in key specification without a key length") [SQL: '
CREATE TABLE `Users` (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    firstname VARCHAR(64) NOT NULL, 
    lastname VARCHAR(64) NOT NULL, 
    email VARCHAR(120) NOT NULL, 
    password VARCHAR(93) NOT NULL, 
    phone VARCHAR(10) NOT NULL, 
    publickey TEXT, 
    isitseller BOOL NOT NULL, 
    money FLOAT NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE (id), 
    UNIQUE (email), 
    UNIQUE (phone), 
    UNIQUE (publickey), 
    CHECK (isitseller IN (0, 1))
)

']

据我所知,我需要使用文本或BLOB类型的逗号以外的任何内容,但我如何才能做到呢?或者用任何方法来使用文本或BLOB作为唯一的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-21 13:48:27

你混淆了“键”和“主键”。在MySQL中,键仅指此上下文中的索引。

我强烈建议您在字段中使用varchar(),而不是text --除非它真的可以很大。

在任何情况下,MySQL对索引键的大小都有限制。而且,text的大小是无限的。矛盾。正如文档所解释的那样,这是通过要求长度来解决的:

对于BLOB和TEXT列的索引,必须指定索引前缀长度。对于CHAR和VARCHAR,前缀长度是可选的。见8.3.4节,“列索引”。

不幸的是,这也意味着不能将text列声明为唯一列,因为这需要索引。

我不认为unique在create table语句中接受长度。可以在前缀上定义唯一索引:

代码语言:javascript
复制
create unique index unq_users_ publickey on users(publickey(100));

注意最大长度。MySQL根据字节设置一个限制,这意味着字符编码会影响最大字符数(100个是安全的)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46863829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档