gpt4 book ai didi

sqlite - Yii使用SQLite使用外键创建表

转载 作者:行者123 更新时间:2023-12-03 18:23:11 25 4
gpt4 key购买 nike

我试图用这样的外键创建表(使用迁移)

public function safeUp()
{
$this->createTable('tbl_category', array(
'id'=>'pk',
'title'=>'string NOT NULL',
'url'=>'string NOT NULL UNIQUE'
));
$this->addForeignKey('FK_category', 'tbl_product', 'category_id', 'tbl_category', 'id', 'CASCADE', 'NO ACTION');
}


它在MySQL中完全可以正常运行,但是现在我想使用SQLite,此代码给出了一个错误,即在SQLite中我无法向现有表中添加外键,因此我仔细研究了 createTable方法的定义:

public integer createTable(string $table, array $columns, string $options=NULL)


并尝试使用 $options参数在此处添加我的外键,但是会生成以下内容:

CREATE TABLE 'tbl_category' (
"id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"title" varchar(255) NOT NULL,
"url" varchar(255) NOT NULL UNIQUE
)
CONSTRAINT FK_category
FOREIGN KEY tbl_product(category_id)
REFERENCES tbl_category(id)
ON DELETE CASCADE ON UPDATE NO ACTION


显然,“ CONSTRAINT ...”代码应放在这些括号内,但事实并非如此。那么如何创建此外键?

最佳答案

说明

函数createTable在source code中定义为:

public function createTable($table, $columns, $options=null)
{
$cols=array();
foreach($columns as $name=>$type)
{
if(is_string($name))
$cols[]="\t".$this->quoteColumnName($name).' '.$this->getColumnType($type);
else
$cols[]="\t".$type;
}
$sql="CREATE TABLE ".$this->quoteTableName($table)." (\n".implode(",\n",$cols)."\n)";
return $options===null ? $sql : $sql.' '.$options;
}


这告诉我,所有选项都适用于通常在Create语句之后(但在最后的分号之前)的内容,例如MySQL中的 ENGINECHARSET。 SQLite语法只是不同,不允许使用此类选项。

addForeignKey函数不起作用,只是没有被编码:

public function addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete=null, $update=null)
{
throw new CDbException(Yii::t('yii', 'Adding a foreign key constraint to an existing table is not supported by SQLite.'));
}


而且SQLite不支持更改表以添加外键子句。



简而言之,您应该将外键子句放在列定义中(在您的产品表中,而不是类别表中):

$this->createTable('tbl_product', array(
'id'=>'pk',
'name'=>'string NOT NULL',
'category_id'=>'integer NOT NULL REFERENCES tbl_category(id)'
));


附录

外键的想法是子表应该声明它,而不是父表。

关于sqlite - Yii使用SQLite使用外键创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13194268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com