4

次の表があります。

mysql> DESC my_contacts;  
+----------+-------------+------+-----+---------+-------+  
| Field    | Type        | Null | Key | Default | Extra |  
+----------+-------------+------+-----+---------+-------+  
| id       | varchar(20) | NO   | PRI |         |       |  
| location | varchar(20) | YES  |     | NULL    |       |  
| city     | varchar(20) | YES  |     | NULL    |       |  
| state    | varchar(2)  | YES  |     | NULL    |       |  
+----------+-------------+------+-----+---------+-------+  
4 rows in set (0.01 sec)   

すべてを選択すると、次のようになります。

mysql> SELECT * FROM my_contacts;  
+----+--------------+------+-------+  
| id | location     | city | state |  
+----+--------------+------+-------+  
| 1  | Chester,NJ   | NULL | NULL  |  
| 2  | Katy,TX      | NULL | NULL  |  
| 3  | San Mateo,CA | NULL | NULL  |  
+----+--------------+------+-------+  
3 rows in set (0.00 sec)  

次のコマンドを実行します。

INSERT INTO my_contacts (city,state)  
VALUES  
(SUBSTRING_INDEX(location,',',1),RIGHT(location,2));  

私の目的は、列のコンマの前の部分とコンマの後の部分を列cityに入力することでした。 しかし、次のことが私のテーブルに起こりました: statelocation

mysql> INSERT INTO my_contacts (city,state)  
    -> VALUES  
    -> (SUBSTRING_INDEX(location,',',1),RIGHT(location,2));  
Query OK, 1 row affected (0.02 sec)   

mysql> SELECT * FROM my_contacts;  
+----+--------------+------+-------+  
| id | location     | city | state |  
+----+--------------+------+-------+  
|    | NULL         | NULL | NULL  |  
| 1  | Chester,NJ   | NULL | NULL  |  
| 2  | Katy,TX      | NULL | NULL  |  
| 3  | San Mateo,CA | NULL | NULL  |  
+----+--------------+------+-------+  
4 rows in set (0.00 sec)  

レコードを取得しましidたが、主キーは空です。これはどのように可能ですか?
そうではないということですNULLが、主キーも空であってはなりませんよね?

4

6 に答える 6

9

フィールドを varchar として定義idしました。これは、整数を格納するために使用している場合、ばかげた考えです。空のフィールドはnullではありません。長さゼロの文字列は有効な文字列であるため、idテーブルに関する限り有効な値です。の空白文字列を挿入してみると、主キー違反が発生します。

INSERT INTO yourtable (id) VALUES (''); // will not work

idフィールドはタイプである必要がありますint。それは「空の」値を許可しません。

于 2013-03-31T19:50:18.567 に答える
2

主キーは一意であるため、テーブルを変更すると、2 番目の行は空の値を追加しようとして失敗します。その結果、次の可能な値が試行されます。最初の値を空にしたくない場合は、デフォルト値を設定できます。

于 2013-03-31T19:50:30.397 に答える
1

空ではありません。おそらく空の文字列です。データ型は varchar(20) であることに注意してください。

于 2013-03-31T19:50:30.377 に答える
1

主キー フィールドに値を割り当てていないため、デフォルトは NULL です。. 主キーが になるようにテーブルを変更しますauto_increment

于 2013-03-31T19:50:31.160 に答える
1

を別のデータベース テーブルに関連する外部キーとして使用できますvarcharが、数値キーとして使用する場合は、 などの数値データ型を使用する必要がありますint

于 2013-03-31T19:51:53.540 に答える
0

これが主キーに関する正確な質問に答えていないことはわかっていますが、あなたの質問は、場所の列から都市と州を解析する際にも問題があるという事実を指摘しているため、使用したいクエリは次のとおりです (注:列ではなく新しい行を追加する INSERT ではなく、UPDATE で既存の行を変更する必要があります)。

UPDATE my_contacts
SET
    city = substr(location, 1, locate(',', location) - 1),
    state = substr(location, locate(',', location) + 1);
于 2014-08-23T00:28:05.000 に答える