2016-12-07 14 views
1

何を試しても、列の名前が変更または削除された後、テーブルのすべてのレコードが削除されます。私は間違って何をしていますか?これは私が試したdeleteメソッドです行やレコードを削除せずにmysql列名の名前を変更して削除するにはどうすればよいですか?

//method 1 (doesn't work) 
ALTER TABLE products_jobs CHANGE COLUMN ".$old_name." ".$new_name." VARCHAR(255) NOT NULL, CHANGE COLUMN ".$old_price." ".$new_price." VARCHAR(255) NOT NULL; 

//method 2 (doesn't work) 
ALTER TABLE products_jobs MODIFY COLUMN ".$old_name." ".$new_name." VARCHAR(255) NOT NULL, MODIFY COLUMN ".$old_price." ".$new_price." VARCHAR(255) NOT NULL; 

//method 3 (doesn't work) 
ALTER TABLE products_jobs ADD ".$new_name." VARCHAR(255) NOT NULL AFTER qty; 
UPDATE products_jobs SET ".$new_name." = CASE WHEN ".$old_name." THEN 1 ELSE 0 END; 
ALTER TABLE products_jobs DROP COLUMN ".$old_name."; 
ALTER TABLE products_jobs ADD ".$new_price." VARCHAR(255) NOT NULL AFTER qty; 
UPDATE products_jobs SET ".$new_price." = CASE WHEN ".$old_price." THEN 1 ELSE 0 END; 
ALTER TABLE products_jobs DROP COLUMN ".$old_price."; 

//method 4 (doesn't work) 
ALTER TABLE products_jobs ADD ".$new_price." VARCHAR(255) NOT NULL AFTER qty, ADD ".$new_name." VARCHAR(255) NOT NULL AFTER qty; 
UPDATE products_jobs set ".$new_price." = ".$old_price.", ".$new_name." = ".$old_name."; 
ALTER TABLE products_jobs DROP COLUMN ".$old_price.", DROP COLUMN ".$old_name."; 

:ここ

は、列名の試みを(各試みは、同時に2つの列をやっている)の名前を変更しています。他にどのようにこれを書くことができるのかわからないので、私はこの1つの方法をもっと試しませんでした。もう一度、同時に2つの列を実行しています。

ALTER TABLE products_jobs DROP COLUMN ".$old_name.", DROP COLUMN ".$old_price."; 

だから、これらすべてのものは、列の名前を変更し、削除して動作しますが、問題は良いされていない、テーブルのすべてのレコードが削除されますです。すべての行/レコードをそのまま維持する必要があります。これが問題なのかどうかは分かりませんが、テーブルタイプ/エンジンはmyisamではなくinnodbです。

UPDATE

私はそこに余分なコードを持っていたことを考え出し、それが間違ったデータベースを参照しました。データベース変数が正しくありませんでした。私がそれを訂正すると、上記の私の問題はなくなりました。ここで私を悩ましていたコードがあります。 MySQLのマニュアルパー

$sql = mysql_query("SELECT COUNT(*) totalColumns FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".$database."' AND table_name = 'products_jobs'"); 
$row = mysql_fetch_assoc($sql); 
$totalcolumns = $row['totalColumns']; 
if ($totalcolumns < 4) { 
    $sql = mysql_query("DELETE FROM products_jobs"); 
} 
+0

これらのPHP変数の値は何ですか?これらのステートメントは、SQLをインジェクトしない限り、ANYローを削除する必要はありません。 – Uueerdo

+0

これらは多くの異なることがありますが、1つの例は、名前1の場合はVariable_List_name、価格1の場合はVariable_List_priceです。 – leoarce

+0

おそらく外国キー –

答えて

2

ALTER TABLE t1 CHANGE a b INTEGER 

「あなたはCHANGE old_col_name new_col_name column_definition句を使用して、列の名前を変更することができますこれを行うには、古いものと新しいカラム名とカラムが現在持っていることの定義を指定します。 "

出典:だからhttp://dev.mysql.com/doc/refman/5.7/en/alter-table.html

、あなたのケース

ALTER TABLE products_jobs CHANGE ".$old_name." ".$new_name . " VARCHAR(255)" 

にちょうどあなたのSQLは、SQLインジェクションの脆弱性であることを注意してください。

+1

あなたが知らないユーザー入力として変数を使用しない限り、脆弱ではありません。 –

+0

は機能しませんでしたが、私のミスはわかりました。 – leoarce

2

以前に失敗しようとしていた原因は、「NOT NULL」記述子です。私はこのような質問への答えをあなたに紹介したいと思います:https://stackoverflow.com/a/5706625/6622781

+1

は機能しませんでしたが、私のミスはわかりました。 – leoarce