mysql beginnersvraag
Betekent Null ja, null toegestaan?
En Null nee, null niet toegestaan?
Met testen kom je er niet uit. Met php programma regel toegevoegd.
Bij testen blijft het onduidelijk.
Testtabel met 3 veldjes varchar(10) :
Naam1 Null ja, standaarwaarde Null
Naam2 Null nee, Geen
Naam3 Null nee, Geen
Vanuit PHP een insert gedaan :
$sql = "INSERT INTO $database.testen2 (naam3) VALUES ('NAAM-3')";
Er wordt dan gewoon een regel toegevoegd met deze insert. Bij verkennen in phpmyadmin toont in de onderstaande velden de waardes :
Naam1 Null
Naam2 geeft een leeg vakje
Naam3 NAAM-3
Klopt dit wel? Wanneer ik zeg dat Null niet toegestaan is bij veld Naam2, dan moet er toch geen regel toegevoegd worden? Want Naam2 krijgt geen waarde, en staat als Null nee gedefinieerd.
Waar ga ik fout in mijn gedachtegang?
Wat is het veldtype van naam2 en naam3? Als dat tekst is, en je staat lengte 0 toe, dan staat er 'de lege string' in het veld, dat is niet hetzelfde als 'Null'
Een leeg vakje is geen NULL, iets is NULL als er schuingedrukt NULL staat.
Verder ingesteld is :
Naam1 Null ja, standaarwaarde Null
Naam2 Null nee, Geen
Naam3 Null nee, Geen
En waar ik mee zit is dat die regel wordt toegevoegd met
$sql = "INSERT INTO $database.testen2 (naam3) VALUES ('NAAM-3')";
Want ik geef alleen Naam3 dus een waarde. dat verooraakt bij Naam1 Null. Dat laatste lijkt me goed want dat is als standaardwaarde aangegeven.
Maar wegens het feit dat Naam2 niet null mag zijn, zou hij volgens mij die regel niet toe mogen voegen.
Waar gaat mijn gedachtegang fout in bovenstaande?
Gewijzigd op 21/01/2011 11:47:44 door Ellen P
Zodra je die query uitvoert, wat wordt dan in de database opgeslagen? Maak anders eens een printscreen van voordat je de query uitvoert en nadat je het doet (dus met gegevens).
Ik ben gewend dat een regel niet toegevoegd wordt in een tabel wanneer die tegen de regels van de database ingaat. Hier mag veld Naam2 niet Null zijn. Wanneer ik alleen Naam3 een waarde geef, en Naam2 geen waarde geef, dan ga ik toch tegen de regel "Null nee" in?
Dan moet de regel toch niet toegevoegd worden in de tabel?
Ehm, nee?
Gewijzigd op 21/01/2011 11:55:34 door Bas Cost Budde
Niks, gewoon een leeg veld.
http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html
As of MySQL 5.0.2, if a column definition includes no explicit DEFAULT value, MySQL determines the default value as follows:
If the column can take NULL as a value, the column is defined with an explicit DEFAULT NULL clause. This is the same as before 5.0.2.
If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. Exception: If the column is defined as part of a PRIMARY KEY but not explicitly as NOT NULL, MySQL creates it as a NOT NULL column (because PRIMARY KEY columns must be NOT NULL), but also assigns it a DEFAULT clause using the implicit default value. To prevent this, include an explicit NOT NULL in the definition of any PRIMARY KEY column.
For data entry for a NOT NULL column that has no explicit DEFAULT clause, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:
Toevoeging op 21/01/2011 12:00:02:
Ellen, geef de uitvoer van 'DESCRIBE jouwtabelnaam' eens hier?
Edit: disregard, je zegt dat het tekstvelden zijn.
As of MySQL 5.0.2, if a column definition includes no explicit DEFAULT value, MySQL determines the default value as follows:
If the column can take NULL as a value, the column is defined with an explicit DEFAULT NULL clause. This is the same as before 5.0.2.
If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. Exception: If the column is defined as part of a PRIMARY KEY but not explicitly as NOT NULL, MySQL creates it as a NOT NULL column (because PRIMARY KEY columns must be NOT NULL), but also assigns it a DEFAULT clause using the implicit default value. To prevent this, include an explicit NOT NULL in the definition of any PRIMARY KEY column.
For data entry for a NOT NULL column that has no explicit DEFAULT clause, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:
Toevoeging op 21/01/2011 12:00:02:
Ellen, geef de uitvoer van 'DESCRIBE jouwtabelnaam' eens hier?
Edit: disregard, je zegt dat het tekstvelden zijn.
Gewijzigd op 21/01/2011 12:14:49 door Bas Cost Budde
Ok, apart, je hebt gelijk. Maar ik snap nu het probleem niet echt, dan moet de TS de database toch gewoon aanpassen. Zo'n probleem is dat niet.
Poging tot vertalen :
Veld neemt NULL aan, wanneer 'standaard Null is ingesteld.
Wanneer Veld kan geen NULL kan aannemen, definieerd Mysql het veld met geen standaard waarde
??
De Primary key moet altijd waarde hebben, lijkt me logisch, Not null veld.
Bij datainvoer een Not Null veld die geen standaard waarde regel heeft, en een insert of replase heeft geen waarde voor dat veld, Mysql handelt veld af "in effect at the time"
Wat is dat laatste ? in effact at the time?
<code>
Volledige teksten Field Type Null Key Default Extra
Wijzigen Verwijderen naam1 varchar(10) YES NULL
Wijzigen Verwijderen naam2 varchar(10) NO NULL
Wijzigen Verwijderen naam3 varchar(10) NO NULL
</code>
Jordy, Wat moet aan de database aangepast worden?
Toevoeging op 21/01/2011 12:15:05:
Ellen P op 21/01/2011 12:13:54:
Eigenlijk snap ik die Engels uitleg niet helemaal.
Poging tot vertalen :
Veld neemt NULL aan, wanneer 'standaard Null is ingesteld.
Wanneer Veld kan geen NULL kan aannemen, definieerd Mysql het veld met geen standaard waarde
??
De Primary key moet altijd waarde hebben, lijkt me logisch, Not null veld.
Bij datainvoer een Not Null veld die geen standaard waarde regel heeft, en een insert of replase heeft geen waarde voor dat veld, Mysql handelt veld af "in effect at the time"
Wat is dat laatste ? in effact at the time?
Jordy, Wat moet aan de database aangepast worden?
Poging tot vertalen :
Veld neemt NULL aan, wanneer 'standaard Null is ingesteld.
Wanneer Veld kan geen NULL kan aannemen, definieerd Mysql het veld met geen standaard waarde
??
De Primary key moet altijd waarde hebben, lijkt me logisch, Not null veld.
Bij datainvoer een Not Null veld die geen standaard waarde regel heeft, en een insert of replase heeft geen waarde voor dat veld, Mysql handelt veld af "in effect at the time"
Wat is dat laatste ? in effact at the time?
Code (php)
1
2
3
4
2
3
4
Volledige teksten Field Type Null Key Default Extra
Wijzigen Verwijderen naam1 varchar(10) YES NULL
Wijzigen Verwijderen naam2 varchar(10) NO NULL
Wijzigen Verwijderen naam3 varchar(10) NO NULL
Wijzigen Verwijderen naam1 varchar(10) YES NULL
Wijzigen Verwijderen naam2 varchar(10) NO NULL
Wijzigen Verwijderen naam3 varchar(10) NO NULL
Jordy, Wat moet aan de database aangepast worden?
Gewijzigd op 21/01/2011 12:15:35 door Ellen P
Wat je aan de database moet aanpassen: Een standaardwaarde NULL op het veld Naam2 zetten. Wat was je idee erachter om iets geen standaardwaarde te geven, en tijdens de query ook geen waarde? Het is niet erg ofzo, maar misschien iets om aan te denken:-)
Kan de kolom een NULL bevatten, dan krijgt hij er een DEFAULT NULL bij. Dat was al zo.
Kan de kolom geen NULL bevatten, dan komt er ook geen DEFAULT. Uitzondering: wanneer de kolom een deel van de primaire sleutel is, maar niet expliciet NOT NULL, maakt Mysql hem toch NOT NULL (omdat primaire sleutelkolommen niet null mogen zijn), maar kent er ook een DEFAULT aan toe met de impliciete standaardwaarde. Om dit te voorkomen moet je bij een primaire sleutelkolom altijd NOT NULL in de definitie opnemen.
Bij gegevensinvoer in een NOT NULL-kolom zonder expliciete DEFAULT-waarde behandelt Mysql de kolom volgens de op dat moment geldende SQL-mode, wanneer een INSERT of REPLACE-opdracht geen waarde voor de kolom bevat, of een UPDATE de kolom op NULL zet, als volgt:
-- dit had ik niet meegeplakt: --
* If strict SQL mode is not enabled, MySQL sets the column to the implicit default value for the column data type.
* If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.
* Is stricte SQL-stand uitgeschakeld, dan zet Mysql de kolom op de impliciete standaardwaarde voor het datatype in de kolom (0 voor integers, '' voor string --red)
* Is de stricte SQL-stand actief, dan krijg je een fout binnen transacties, en de opdracht wordt teruggedraaid. Voor tabellen zonder transacties krijg je een foutmelding, maar treedt die op bij de tweede of later volgende rij van een opdracht die meer rijen bestrijkt, dan zijn de voorgaande rijen wel toegevoegd (of bewerkt --red)
@Bas Cost Budde
In ieder geval bedankt weer voor de uitgebreide uitleg.
Wanneer ik jouw vertaling interpreteer op wat er gebeurt, is dat het volgende. SQL staat niet op de strikte stand, en op veld naam2 wordt '' toegevoegd.
Ik word wel wat eng van het feit dat er dus blijkbaar zomaar foutieve regel toegevoegd kan worden zo.
Moet ik dus blijkbaar met je eigen programmeerkunsten (die bij mij beperkt zijn) afvangen.
Want ik kan binnen phpmyadmin niet iets vinden waarop ik stricte of niet stricte standjes kan wijzigen.
set sql_mode=STRICT_ALL_TABLES;
Bij sql_mode=STRICKT_ALL_TABLES; voegt hij dus de regel uit opdracht,
$sql = "INSERT INTO $database.testen2 (naam3) VALUES ('NAAM-3')";
NIET meer toe!!
Kan ik er nog iets over vragen, want ik heb al een tijdje zitten lezen op
http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_strict_all_tables
maar vind niet mijn antwoord.
Hoe ver gaat de opdracht? wat is het bereik van?
set sql_mode=STRICT_ALL_TABLES;
Ik heb ondekt dat ik hem uit kan schakelen met
set sql_mode='';
Heeft dit betrekking op een sessie, of op een volgende sql opdracht?
Is het bereik alle databases?
Kan ik dit ook beperken tot een bepaalde database?
je kunt dus kiezen uit session (alleen voor nu), en global (vanaf nu en verder)
kan iemand hier uitsluitsel over geven?
Gewijzigd op 21/01/2011 14:13:35 door Ellen P
Nee, dat kan niet; de mode is van toepassing op de hele server.
Zal ik denk ik goed moeten programmeren.
Ik zal me maar niet wagen aan op de gok de server instelling wijzigen, en iets anders onderuit halen.
In ieder geval ben ik wel wat wijzer geworden.