2012-02-23 6 views
1

私はMYSQLでMyISAMエンジンを使用しています。私は、テーブル内の外部キーが自動的にインデックスを作成していることがわかります。 SqlalchemyまたはMYSQLの動作ですか?私は外部キーのインデックスは必要ありません。私は何をすべきか?列を定義するときにparam index = Falseを追加しますか?Sqlalchemyは自動的に外部キーのインデックスを作成しますか?

マイコード:

class A(Base): 
    __tablename__ = "a" 
    a_id = Column(BigInteger, primary_key=True, autoincrement=True) 

class B(Base): 
    __tablename__ = "b" 
    b_id = Column(BigInteger, primary_key=True, autoincrement=True) 
    a_id = Column(BigInteger, ForeignKey(A.a_id)) 

私はBでA_IDのインデックスが自動的に作成されていました。それが正しいか? このようなインデックスを削除したい場合、これを行うことはできますか?

class B(Base): 
    __tablename__ = "b" 
    b_id = Column(BigInteger, primary_key=True, autoincrement=True) 
    a_id = Column(BigInteger, ForeignKey(A.a_id), index=False) 
+0

MyISAMでインデックスを作成するコードを提供してください – Nilesh

+0

インデックスに何かの外部キーを設定することはできません。 – ceejayoz

答えて

1

私のローカルマシンにモデルを作成しましたが、私は外部キーのインデックスを見つけませんでした。

私は

from sqlalchemy import create_engine 

engine = create_engine('mysql://test:[email protected]/test1', echo=True) 

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, Date, Text, BigInteger, ForeignKey 
from sqlalchemy.orm.attributes import InstrumentedAttribute 


Base = declarative_base() 


class A(Base): 
    __tablename__ = "a" 
    a_id = Column(BigInteger, primary_key=True, autoincrement=True) 

class B(Base): 
    __tablename__ = "b" 
    b_id = Column(BigInteger, primary_key=True, autoincrement=True) 
    a_id = Column(BigInteger, ForeignKey(A.a_id)) 

Base.metadata.create_all(engine) 

を使用し、バックグラウンドログがあります。

2012-02-24 09:39:24,249 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 
2012-02-24 09:39:24,249 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,254 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%' 
2012-02-24 09:39:24,254 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,277 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names' 
2012-02-24 09:39:24,277 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,288 INFO sqlalchemy.engine.base.Engine SHOW COLLATION 
2012-02-24 09:39:24,289 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,292 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 
2012-02-24 09:39:24,292 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,293 INFO sqlalchemy.engine.base.Engine DESCRIBE `a` 
2012-02-24 09:39:24,293 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,321 INFO sqlalchemy.engine.base.Engine ROLLBACK 
2012-02-24 09:39:24,322 INFO sqlalchemy.engine.base.Engine DESCRIBE `b` 
2012-02-24 09:39:24,322 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,323 INFO sqlalchemy.engine.base.Engine ROLLBACK 
2012-02-24 09:39:24,324 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE a (
    a_id BIGINT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (a_id) 
) 


2012-02-24 09:39:24,324 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,590 INFO sqlalchemy.engine.base.Engine COMMIT 
2012-02-24 09:39:24,591 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE b (
    b_id BIGINT NOT NULL AUTO_INCREMENT, 
    a_id BIGINT, 
    PRIMARY KEY (b_id), 
    FOREIGN KEY(a_id) REFERENCES a (a_id) 
) 


2012-02-24 09:39:24,591 INFO sqlalchemy.engine.base.Engine() 
2012-02-24 09:39:24,762 INFO sqlalchemy.engine.base.Engine COMMIT 

私もab用のMySQLでのcreate table文を確認してください。

インデックスは、外部キーにないプライマリキーのみです。

お使いのマシンでこれを試してください。テーブルbの外部キーのインデックスを作成しているマシンを見つけたら、この回答に書いたように作成してください。

これがあなたの問題を解決することを願っています。

+0

ありがとうございます。私はもう一度それを試みます。私はMyISAMを使用し、InnoDBを使用しています。とにかく、私はそれを自分で行うことができます。どうもありがとう! – flypen

+0

MyISAMのインデックスを取得した場合は、MyISAMのログを提供してください。 InnoDBとは異なるMyISAMの動作を理解するのに役立ちます。 – Nilesh

1

ラファダ、間違っています。表BのKEY a_ida_id)は、外部キーフィールドに索引が作成されたことを明確に示しています。これは、InnoDBのの行動である - このようなインデックスが存在しない場合は、自動的に外部キー関係のフィールドの上にインデックスを作成します。

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

0

これは、MySQLのbehaviorであり、それはMySQLのために正しいです。あなたはこの事実と調和しなければなりません。少なくとも、私は外部キーの索引付けを取り除く方法を知らない。

列を定義するときにparam index = Falseを追加しますか?

まあ、多分...私はそれを試してみます。

関連する問題