2017-10-21 16 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 

しかし、私はそれが私が理解したよう私に

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

'] 

を出力)db.create_all(とユーザーテーブルを作成しようとすると、私はTEXTやBLOB型のcolunmから何かを使う必要がありますが、どうしたらいいですか? TEXTやBLOBをUNIQUEとして使用する方法はありますか?

+0

'publickey'は一意でなければならず、' null'でもかまいませんか? ;)これにもかかわらず、実際のエラーはhttps://stackoverflow.com/questions/1827063/mysql-error-key-specification-with-a-key-lengthで見つけることができます – GuyT

答えて

3

「キー」と「プライマリキー」を混同しています。 MySQLでは、キーは単にこのコンテキストのインデックスを指します。

本当に本当に大きくない限り、textではなく、フィールドにvarchar()を使用することを強くお勧めします。

いずれにしても、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は安全です)。

関連する問題