我有一个表格“ forms”,它有一个主键-“ id”。 这个主键是通过迁移创建的:
$this->createTable('forms', [
'id' => $this->primaryKey(),
'group_id' => $this->integer(11),
'form_id' => $this->integer(11)
]);
现在,我需要删除此主键“ id”,并从“ form_id”和“ group_id”创建一个新的复合主键。
我在新迁移中尝试过类似的方法:
public function safeUp()
{
$this->dropPrimaryKey('id', 'forms');
$this->addPrimaryKey('pk_forms', 'forms', ['form_id', 'group_id']);
}
但是发生错误: 删除主键ID ...异常:SQLSTATE [42000]:语法错误或访问冲突:1075错误的表定义;只能有一个自动列,并且必须将其定义为键
如何删除旧的主键并创建一个新的主键?
答案 0 :(得分:1)
该错误意味着您的主键是一个自动递增的列,此类列必须是错误所指出的键,因此要替换它,您需要先删除auto_increment行为
我实际上没有使用过yii迁移,但这可能行得通(或者……可能行不通)
from sqlalchemy import event
from sqlalchemy.engine import Engine
from sqlite3 import Connection as SQLite3Connection
@event.listens_for(Engine, "connect")
def _set_sqlite_pragma(dbapi_connection, connection_record):
if isinstance(dbapi_connection, SQLite3Connection):
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON;")
cursor.close()