![](/img/trans.png)
[英]I am using db forge for database migration.add_foreign_key add keys from first created table to second one
[英]CodeIgniter DB Forge add Engine and Unique key to table
我正在嘗試使用遷移為CI插件系統創建表。 這是遷移文件的代碼。
public function up()
{
$fields = array(
'plugin_id bigint(20) unsigned NOT NULL AUTO_INCREMENT',
'plugin_system_name varchar(255) NOT NULL',
'plugin_uri varchar(120) DEFAULT NULL',
'plugin_version varchar(30) NOT NULL',
'plugin_description text',
'plugin_author varchar(120) DEFAULT NULL',
'plugin_author_uri varchar(120) DEFAULT NULL',
'plugin_data longtext'
);
$this->dbforge->add_field($fields);
$this->db->query('UNIQUE KEY `plugin_index` (`plugin_system_name`) USING BTREE');
$this->db->query('ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1');
$this->dbforge->add_key('plugin_id', true);
$this->dbforge->create_table('plugins');
}
當然不會給我以下錯誤
Error Number: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIQUE KEY `plugin_index` (`plugin_system_name`) USING BTREE' at line 1
UNIQUE KEY `plugin_index` (`plugin_system_name`) USING BTREE
Filename: \xampp\htdocs\myapp\system\database\DB_driver.php
Line Number: 330
而CI Plugin sql如下
DROP TABLE IF EXISTS `plugins`;
CREATE TABLE `plugins` (
`plugin_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`plugin_system_name` varchar(255) NOT NULL,
`plugin_name` varchar(255) NOT NULL,
`plugin_uri` varchar(120) DEFAULT NULL,
`plugin_version` varchar(30) NOT NULL,
`plugin_description` text,
`plugin_author` varchar(120) DEFAULT NULL,
`plugin_author_uri` varchar(120) DEFAULT NULL,
`plugin_data` longtext,
PRIMARY KEY (`plugin_id`),
UNIQUE KEY `plugin_index` (`plugin_system_name`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
我已經閱讀了Forge的 CodeIgniter文檔,但是他們沒有對SQL的所有方面進行詳細描述。 因此,如果有人可以幫助我解決此問題並使它與Migration兼容,我將不勝感激。
嘗試這個:
$sql = "DROP TABLE IF EXISTS `plugins`;
CREATE TABLE `plugins` (
`plugin_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`plugin_system_name` varchar(255) NOT NULL,
`plugin_name` varchar(255) NOT NULL,
`plugin_uri` varchar(120) DEFAULT NULL,
`plugin_version` varchar(30) NOT NULL,
`plugin_description` text,
`plugin_author` varchar(120) DEFAULT NULL,
`plugin_author_uri` varchar(120) DEFAULT NULL,
`plugin_data` longtext,
PRIMARY KEY (`plugin_id`),
UNIQUE KEY `plugin_index` (`plugin_system_name`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; ";
$this->db->query($sql);
根據這篇文章 ,這是唯一的方法,因為DBForge
沒有創建新表的方法。
更新:
這個帖子我覺得這是一個妥善的解決辦法。 如果鏈接斷開,請在此處給出:
如果您只想擁有MYISAM,那么阻力最小的途徑就是重載CI_DB_Forge_mysql類。 為此,您需要在應用程序/核心文件夾中創建一個MY_Loader.php類文件。
這是來自sparks生成的加載程序類,由附加的dbforge> overload縮寫。
<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Sparks
*
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author CodeIgniter Reactor Dev Team
* @author Kenny Katzgrau <katzgrau@gmail.com>
* @since CodeIgniter Version 1.0
* @filesource
*/
/**
* Loader Class
*
* Loads views and files
*
* @package CodeIgniter
* @subpackage Libraries
* @author CodeIgniter Reactor Dev Team
* @author Kenny Katzgrau <katzgrau@gmail.com>
* @category Loader
* @link http://ellislab.com/codeigniter/user-guide/libraries/loader.html
*/
class MY_Loader extends CI_Loader
{
...
// --------------------------------------------------------------------
/**
* Load the Database Forge Class
*
* @return string
*/
public function dbforge()
{
if ( ! class_exists('CI_DB'))
{
$this->database();
}
$CI =& get_instance();
require_once(BASEPATH.'database/DB_forge.php');
require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge.php');
/* Look for overload files in the /application/core folder */
if (file_exists(BASEPATH.'../'.APPPATH.'core/MY_CI_DB_'.$CI->db->dbdriver.'_forge.php')) {
require_once(BASEPATH.'../'.APPPATH.'core/MY_CI_DB_'.$CI->db->dbdriver.'_forge.php');
$class = 'MY_CI_DB_'.$CI->db->dbdriver.'_forge';
} else {
$class = 'CI_DB_'.$CI->db->dbdriver.'_forge';
}
$CI->dbforge = new $class();
}
}
在您的應用程序/庫文件夾中創建一個名為MY_CI_DB_mysql_forge.php的文件。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* MySQL Forge Class Force MYISAM
*
* @category Database
* @author
* @link
*/
class MY_CI_DB_mysql_forge extends CI_DB_mysql_forge {
// --------------------------------------------------------------------
/**
* Create Table
*
* @access private
* @param string the table name
* @param mixed the fields
* @param mixed primary key(s)
* @param mixed key(s)
* @param boolean should 'IF NOT EXISTS' be added to the SQL
* @return bool
*/
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
{
$sql = 'CREATE TABLE ';
if ($if_not_exists === TRUE)
{
$sql .= 'IF NOT EXISTS ';
}
$sql .= $this->db->_escape_identifiers($table)." (";
$sql .= $this->_process_fields($fields);
if (count($primary_keys) > 0)
{
$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
$primary_keys = $this->db->_protect_identifiers($primary_keys);
$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
}
if (is_array($keys) && count($keys) > 0)
{
foreach ($keys as $key)
{
if (is_array($key))
{
$key_name = $this->db->_protect_identifiers(implode('_', $key));
$key = $this->db->_protect_identifiers($key);
}
else
{
$key_name = $this->db->_protect_identifiers($key);
$key = array($key_name);
}
$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
}
}
$sql .= "\n) ENGINE=MYISAM DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
return $sql;
}
}
添加這些將啟用$ this-> dbforge-> create_table()方法以返回MYISAM表的sql。
如果您有權訪問mysql實例,則可以在啟動時使用–default-storage-engine或–default-table-type強制將默認表引擎設置為MYISAM或其他值。
對於舊版本的CI,這也是一個不錯的發現
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.