mysql beginnersvraag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ellen P

Ellen P

21/01/2011 11:14:37
Quote Anchor link
Dit betreft phpMyAdmin met mySQL
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?
 
PHP hulp

PHP hulp

06/08/2020 00:48:51
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 11:37:48
Quote Anchor link
"Null" in phpMyAdmin betekent: het veld mag null zijn.

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'
 
Jordy nvt

Jordy nvt

21/01/2011 11:39:16
Quote Anchor link
Je moet het denk ik wat beter uitleggen, ik snap het in ieder geval niet. Als je gewoon een Naam2 veld in je database zet met als standaardwaarde NULL, dan wordt er toch standaard NULL ingevoegd? En als je er geen NULL in wilt zorg je dat de standwaarde leeg is, of 0 bevat, oid.

Een leeg vakje is geen NULL, iets is NULL als er schuingedrukt NULL staat.
 
Ellen P

Ellen P

21/01/2011 11:45:57
Quote Anchor link
Het zijn 3 veldjes type varchar(10), de namen van de veldjes zijn naam1, naam2 en naam3.
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
 
Jordy nvt

Jordy nvt

21/01/2011 11:48:03
Quote Anchor link
Wat verwacht jij dat bij Naam2 ingevuld moet worden?

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).
 
Ellen P

Ellen P

21/01/2011 11:53:01
Quote Anchor link
Kan ik binnen dit forum wat met printscreens?

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?
 
Jordy nvt

Jordy nvt

21/01/2011 11:54:11
Quote Anchor link
"Wanneer ik alleen Naam3 een waarde geef, en Naam2 geen waarde geef, dan ga ik toch tegen de regel "Null nee" in?"

Ehm, nee?
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 11:55:12
Quote Anchor link
Jordy, Naam2 is ingesteld op NOT NULL. Wat komt er volgens jou in, als je in een INSERT geen waarde opgeeft?
Gewijzigd op 21/01/2011 11:55:34 door Bas Cost Budde
 
Jordy nvt

Jordy nvt

21/01/2011 11:55:52
Quote Anchor link
Niks, gewoon een leeg veld.
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 11:58:13
Quote Anchor link
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.
Gewijzigd op 21/01/2011 12:14:49 door Bas Cost Budde
 
Jordy nvt

Jordy nvt

21/01/2011 12:00:04
Quote Anchor link
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.
 
Ellen P

Ellen P

21/01/2011 12:13:54
Quote Anchor link
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?


<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?


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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     



Jordy, Wat moet aan de database aangepast worden?
Gewijzigd op 21/01/2011 12:15:35 door Ellen P
 
Jordy nvt

Jordy nvt

21/01/2011 12:18:06
Quote Anchor link
Het betekent dat MySQL standaard een veld de waarde NULL geeft als je iets wilt invoegen dat geen waarde en geen standaardwaarde heeft.

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:-)
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 12:22:01
Quote Anchor link
Sinds versie 5.0.2 bepaalt Mysql de standaardwaarde van een kolom, wanneer er in de definitie geen DEFAULT is opgegeven, als volgt:

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)
 
Ellen P

Ellen P

21/01/2011 12:58:44
Quote Anchor link
@Jordy nvt Myn idee er achter was dat ik wilde weten hoe ik met MySQL moet omgaan. Aangezien ik soms nogal problemen heb met technische en engels technische uitleg, test ik soms gewoon dingen uit, om te kijken hoe het reageert.

@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.
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 13:02:20
Quote Anchor link
Dit als query uitvoeren:
set sql_mode=STRICT_ALL_TABLES;
 
Ellen P

Ellen P

21/01/2011 13:31:00
Quote Anchor link
Leuk !!
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?
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 13:44:36
Quote Anchor link
SET [GLOBAL|SESSION] sql_mode

je kunt dus kiezen uit session (alleen voor nu), en global (vanaf nu en verder)
 
Ellen P

Ellen P

21/01/2011 13:46:34
Quote Anchor link
Er staan meer databases, en het moet eigenlijk alleen voor mijn database. Kun je daartoe beperken? Blijkbaar niet want dat zie ik nergens staan.
kan iemand hier uitsluitsel over geven?
Gewijzigd op 21/01/2011 14:13:35 door Ellen P
 
Bas Cost Budde

Bas Cost Budde

21/01/2011 14:17:15
Quote Anchor link
Nee, dat kan niet; de mode is van toepassing op de hele server.
 
Ellen P

Ellen P

21/01/2011 14:41:43
Quote Anchor link
Bedankt Bas,
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.