Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii使用SQLite创建带有外键的表_Sqlite_Activerecord_Yii - Fatal编程技术网

Yii使用SQLite创建带有外键的表

Yii使用SQLite创建带有外键的表,sqlite,activerecord,yii,Sqlite,Activerecord,Yii,我正在尝试用外键创建表(使用迁移),如下所示 public function safeUp() { $this->createTable('tbl_category', array( 'id'=>'pk', 'title'=>'string NOT NULL', 'url'=>'string NOT NULL UNIQUE' )); $this->addForeignKey('FK_catego

我正在尝试用外键创建表(使用迁移),如下所示

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
param在此处添加我的外键,但它会生成以下结果:

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

显然,“约束…”代码应该在这些括号内,但它不是。那么,我如何创建这个外键呢?

使用了$this->execute,我在其中放置了纯SQL语句。

使用了$this->execute,我在其中放置了纯SQL语句。

解释 函数createTable在中定义为:

这告诉我,所有选项都是用于通常在Create语句之后(但在最后分号之前)的内容,比如MySQL中的
引擎
字符集
。SQLite语法完全不同,不允许这样的选项

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

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不支持通过修改表来添加外键子句

解决方案 长话短说,您应该将外键子句放在列定义中(在产品表中,而不是类别表中):

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

解释 函数createTable在中定义为:

这告诉我,所有选项都是用于通常在Create语句之后(但在最后分号之前)的内容,比如MySQL中的
引擎
字符集
。SQLite语法完全不同,不允许这样的选项

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

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)'
));