未知の列を持つ「SELECT INTO」をどのようにすることができますか?
INSERT INTO `newtable`
(`a`, `b`, `c`, `d`)
SELECT
`a`, `b`, `c` , `d` FROM `oldtable`
フィールドaとcが 'newtable'に存在しない場合、MySQLは常にエラーをスローします。もちろん、これは正当なエラーであると私は理解しています。私が知りたいのは、これを扱うケースステートメントのようなものを作る方法があるということです。クエリは動的テーブルに基づいて動的に構築されるため、どのフィールドが存在するかを知る方法はありません。
あなたの精通したアイデアは何ですか?
newtableは上記のように動的に定義されています。
public function updateTableSchema($table, $fields)
{
// Drop the temporary table if exists
$sql = "
DROP TABLE IF EXISTS `temp_{$table}`
";
if (!$this->db()->query($sql)) return FALSE;
// Make a backup of the original table and select the old values into it
$sql = "
CREATE TABLE `temp_{$table}`
SELECT * FROM `$table`
";
if (!$this->db()->query($sql)) return FALSE;
// Drop the old table
if (!$this->db()->query("DROP TABLE `$table`")) return FALSE;
// Recreate the table with the new fields
$sql = "
CREATE TABLE IF NOT EXISTS `$table`
(\n";
$sql .= "`id` int(11) NOT NULL AUTO_INCREMENT,\n";
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field` varchar(255) NOT NULL,\n");
}
$sql .= "PRIMARY KEY (`id`)\n";
$sql .= "
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
";
if (!$this->db()->query($sql)) return FALSE;
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
// Insert the temporary records into the new table
$sql = "INSERT INTO `$table` (";
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field`, ");
}
$sql = rtrim($sql, ', ') . ') SELECT ';
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field`, ");
}
$sql = rtrim($sql, ', ') . " FROM `temp_{$table}`";
print $sql;
if (!$this->db()->query($sql)) return FALSE;
// Drop the temporary table
$sql = "DROP TABLE `temp_{$table}`";
return $this->db()->query($sql);
}
ここに元のテーブルは、どんなときも。新しいテーブルは、これらの変更にも準拠する必要があります。
更新: 作業の流れは次のとおりです。
public function updateTableSchema($table, $fields)
{
// Drop the temporary table if exists
$sql = "
DROP TABLE IF EXISTS `temp_{$table}`
";
if (!$this->db()->query($sql)) return FALSE;
// Make a backup of the original table and select the old values into it
$sql = "
CREATE TABLE `temp_{$table}`
SELECT * FROM `$table`
";
if (!$this->db()->query($sql)) return FALSE;
// Drop the old table
if (!$this->db()->query("DROP TABLE `$table`")) return FALSE;
// Recreate the table with the new fields
$sql = "
CREATE TABLE IF NOT EXISTS `$table`
(\n";
$sql .= "`id` int(11) NOT NULL AUTO_INCREMENT,\n";
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field` varchar(255) NOT NULL,\n");
}
$sql .= "PRIMARY KEY (`id`)\n";
$sql .= "
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
";
if (!$this->db()->query($sql)) return FALSE;
// Insert the temporary records into the new table
$sql = "INSERT INTO `$table` (";
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field`, ");
}
$sql = rtrim($sql, ', ') . ') SELECT ';
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field`, ");
}
$sql = rtrim($sql, ', ') . " FROM `temp_{$table}`";
try
{
$this->db()->query($sql);
}
catch (error $e)
{
if (preg_match('/Unknown column/', $e->getMessage()))
{
$new_field = utility::getStringBetween($e->getMessage(), "'", "'");
if (!$new_field) return FALSE;
$this->db()->query("TRUNCATE TABLE `$table`");
$key = array_search($new_field, $fields);
$key--;
// Check if adding after
if ($key > 0)
{
$sql = "
ALTER TABLE `temp_{$table}`
ADD `$new_field` VARCHAR(255) NOT NULL AFTER `{$fields[$key]}`
";
if (!$this->db()->query($sql)) return FALSE;
}
// Check if adding before
else
{
$sql = "
ALTER TABLE `temp_{$table}`
ADD `$new_field` VARCHAR(255) NOT NULL FIRST
";
if (!$this->db()->query($sql)) return FALSE;
}
// Insert the temporary records into the new table
$sql = "INSERT INTO `$table` (";
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field`, ");
}
$sql = rtrim($sql, ', ') . ') SELECT ';
foreach ($fields as $field)
{
$sql .= html_entity_decode("`$field`, ");
}
$sql = rtrim($sql, ', ') . " FROM `temp_{$table}`";
if (!$this->db()->query($sql)) return FALSE;
}
}
// Drop the temporary table
$sql = "DROP TABLE `temp_{$table}`";
return $this->db()->query($sql);
}
69です%はかなりまともですが、私は問題が表示されません? – RobertPitt
灰色ではほとんど見えず、緑色はより良いです。 – ajreal