@Mods: Eventuell sollten wir das ganze hier abspalten...
Bloß das du keine Null werte übergibt sondern für die Spalte ein Default gepflegt ist.
Gerade selbst nochmal ausprobiert (MySQL 5.6.21):
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
mysql> CREATE TABLE TEST_TB (
-> ID INTEGER AUTO_INCREMENT PRIMARY KEY,
-> BALANCE INTEGER NOT NULL,
-> SALARY INTEGER NOT NULL
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC TEST_TB;
+---------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| BALANCE | int(11) | NO | | NULL | |
| SALARY | int(11) | NO | | NULL | |
+---------+---------+------+-----+---------+----------------+
3 rows in set (0.06 sec)
mysql> INSERT INTO TEST_TB (BALANCE) VALUES (1000);
Query OK, 1 row affected, 1 warning (0.08 sec)
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------+
| Warning | 1364 | Field 'SALARY' doesn't have a default value |
+---------+------+---------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM TEST_TB;
+----+---------+--------+
| ID | BALANCE | SALARY |
+----+---------+--------+
| 1 | 1000 | 0 |
+----+---------+--------+
1 row in set (0.00 sec)
|
Man beachte, wie als Default anscheinend
NULL definiert ist, er dann beim Insert die Warnung ausgibt, es sei kein Default definiert, aber dann trotzdem einfach eine 0 einfügt.
Noch ein Beispiel: Wenn du einem User Rechte geben möchtest, den Username im GRANT-Statement aber falsch schreibst, was tut MySQL dann wohl? Einen Fehler ausgeben? Nö, einfach einen neuen User mit den Rechten anlegen. Kann man auch ausschalten, so wie alle anderen fragwürdigen Default-Einstellungen von MySQL, aber am Ende gilt immer der Leitsatz: "Das sollte standardmäßig so sein, aber man kann es immerhin so einstellen!" (Wobei sie das in einem der 5.7.x Updates glaube ich endlich gefixt haben. Aber ich bezweifle, dass die Mehrheit der MySQL DBs dieser Welt dieses Update schon eingespielt haben, XAMPP läuft noch mit 5.6.21...)
Noch einer meiner Lieblinge:
CHECK constraint in MySQL is not working
Noch mehr Nonsense gefällig? Schauen wir mal, wie MySQL Boolean-Werte definiert:
BOOL, BOOLEAN
These types are synonyms for TINYINT(1). A value of zero is considered false. Nonzero values are considered true
Dann schauen wir doch mal...
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> CREATE TABLE IF NOT EXISTS TEST_TB (
-> BOOLS BOOLEAN NOT NULL
-> );
Query OK, 0 rows affected (4.02 sec)
mysql> DESC TEST_TB;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| BOOLS | tinyint(1) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.01 sec)
|
Sehen wir uns mal an, was man mit diesem tinyint so anstellen kann
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
mysql> INSERT INTO TEST_TB VALUES (TRUE), (FALSE), (1), (0), (42), (-42);
Query OK, 6 rows affected (0.09 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM TEST_TB;
+-------+
| BOOLS |
+-------+
| 1 |
| 0 |
| 1 |
| 0 |
| 42 |
| -42 |
+-------+
6 rows in set (0.00 sec)
|
Ok, war zu erwarten. Wir erinnern uns jetzt nochmal an das Zitat von oben:
Nonzero values are considered true
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT
-> BOOLS,
-> IF(BOOLS = TRUE, "TRUE!", "FALSE!") TEST
-> FROM TEST_TB;
+-------+--------+
| BOOLS | TEST |
+-------+--------+
| 1 | TRUE! |
| 0 | FALSE! |
| 1 | TRUE! |
| 0 | FALSE! |
| 42 | FALSE! |
| -42 | FALSE! |
+-------+--------+
6 rows in set (0.00 sec)
|
wat
Ich gebe zu, dass man ein ordentliches Ergebnis erhält, wenn man
IF(BOOLS, "TRUE!", "FALSE!") verwendet, aber wir haben hier wieder einen Fall, bei dem das Ergebnis von meinen Erwartungen und Erfahrungen mit anderen DBMS abweicht. Die Frage, wieso MySQL überhaupt Booleans nicht einfach auf feste "true" und "false" Werte festlegt, steht aber immer noch im Raum.
Aber ich hab grad soviel Spaß mit MySQL, da kann ich noch einen ziehen!
|
Quellcode
|
1
2
3
4
5
6
7
8
9
|
mysql> CREATE TABLE TEST_TB (
-> ID INTEGER AUTO_INCREMENT PRIMARY KEY,
-> VALUE INTEGER NOT NULL
-> );
Query OK, 0 rows affected (0.30 sec)
mysql> INSERT INTO TEST_TB (VALUE) VALUES (0), (1), (42);
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0
|
Hat jemand Hunger?
|
Quellcode
|
1
2
3
4
5
6
7
|
mysql> SELECT * FROM TEST_TB WHERE VALUE = "APFELKUCHEN";
+----+-------+
| ID | VALUE |
+----+-------+
| 1 | 0 |
+----+-------+
1 row in set, 1 warning (0.03 sec)
|
Ähm. Was? Ah, wir haben zumindest eine Warnung, schauen wir mal...
|
Quellcode
|
1
2
3
4
5
6
7
|
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'APFELKUCHEN' |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)
|
Heute habe ich gelernt, dass ein Apfelkuchen eine Gleitkommazahl ist. Noch dazu habe ich gelernt, dass MySQL (out of the box) keine Fehlermeldung oder Warnung ausgibt, wenn ich eine Gleitkommazahl (Oder einen Apfelkuchen) in ein
Integer-Feld stecken will.