2017-10-21 87 views
-1

我有一個表指定用戶,這裏是它的架構:MySQL TEXT或BLOB類型不能是唯一的嗎?

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()它輸出我

(_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)) 
) 

'] 

據我瞭解我需要使用任何TEXT或BLOB類型的colunm,但我該怎麼做?或者使用TEXT或BLOB作爲UNIQUE的任何方式?

+0

'publickey'必須是唯一的,可以是'null'? ;)儘管如此,真正的錯誤可以在https://stackoverflow.com/questions/1827063/mysql-error-key-specification-without-a-key-length – GuyT

回答

3

你在「鑰匙」與「主鑰匙」混淆。在MySQL中,一個關鍵只是指這個上下文中的索引。

我強烈建議您使用varchar()作爲字段,而不是text - 除非它確實可以非常大。

在任何情況下,MySQL對索引鍵的大小都有限制。而且,text的大小是無限的。矛盾。這是解決 - 作爲documentation解釋 - 通過要求長度:

有關BLOB和TEXT列的索引,必須指定索引的前綴長度 。對於CHAR和VARCHAR,前綴長度是可選的。請參見部分 8.3.4,「列索引」。

不幸的是,這也意味着你不能聲明text列是唯一的,因爲這需要一個索引。

我不認爲uniquecreate table語句接受長度。您可以在前綴上定義唯一索引:

create unique index unq_users_ publickey on users(publickey(100)); 

請注意最大長度。 MySQL根據字節提出限制,這意味着字符編碼會影響最大字符數(100是安全的)。

相關問題