Primarykey-Contraint check bei "insert" oder "commit"?

Primarykey-Contraint check bei "insert" oder "commit"?

am 31.07.2006 10:37:00 von Michael Konietzka

Hi

MySQL-Version;: 4.0.28 standard
TableTyp: InnoDB

Wann wird bei einer Insert-Operation die Überprüfung des
Constraints gemacht?

Bsp:
Ich füge einen Datensatz ein, welcher den Primarykey-Constraints
verletzen würde. Meldet daß die MySQL sofort nach einfügen oder
erst beim commit?
Könnte man das Verhalten auch durch Konfiguration ändern?

Grüße
Michael

Re: Primarykey-Contraint check bei "insert" oder "commit"?

am 31.07.2006 10:46:50 von Christian Kirsch

Michael Konietzka schrieb:
> Hi
>
> MySQL-Version;: 4.0.28 standard
> TableTyp: InnoDB
>
> Wann wird bei einer Insert-Operation die Überprüfung des
> Constraints gemacht?
>
> Bsp:
> Ich füge einen Datensatz ein, welcher den Primarykey-Constraints
> verletzen würde. Meldet daß die MySQL sofort nach einfügen oder
> erst beim commit?

Was meinst Du mit "Primary Key Constraint verletzen" - den Versuch,
einen Datensatz mit einem PK einzufügen, der schon existiert?

Was spricht dagegen, das auszuprobieren?

Und was spräche dafür, PK-Constraints nur in Transaktionen zu prüfen?

> Könnte man das Verhalten auch durch Konfiguration ändern?

s.o.: Constraints und Transaktionen haben nicht direkt etwas
miteinander zu tun. Also sollte die DB sie wohl sofort prüfen.

Re: Primarykey-Contraint check bei "insert" oder "commit"?

am 31.07.2006 10:59:34 von Michael Konietzka

Christian Kirsch schrieb:
> Michael Konietzka schrieb:
>> Hi
>>
>> MySQL-Version;: 4.0.28 standard
>> TableTyp: InnoDB
>>
>> Wann wird bei einer Insert-Operation die Überprüfung des
>> Constraints gemacht?
>>
>> Bsp:
>> Ich füge einen Datensatz ein, welcher den Primarykey-Constraints
>> verletzen würde. Meldet daß die MySQL sofort nach einfügen oder
>> erst beim commit?
>
> Was meinst Du mit "Primary Key Constraint verletzen" - den Versuch,
> einen Datensatz mit einem PK einzufügen, der schon existiert?

Exakt.

> Was spricht dagegen, das auszuprobieren?

Nix, aber beim Herausfinden durch Probieren besteht immer die Gefahr,
daß man bestimmte Parameter unbewußt beim Probieren anders setzt
oder bestimmte Umgebungsparameter anders sind. Beim "schnell mal
probieren" kann man auch schnell mal auf die Nase fallen kann, weil
die Testumgebung evtl nicht mit der Produktivumgebung kompatibel ist.

Mich interessiert zudem, ob das im SQL-Standard spezifiziert wäre und
ob MySQL das zb vielleicht je nach Isolationlevel anders handhabt.

> Und was spräche dafür, PK-Constraints nur in Transaktionen zu prüfen?
>
>> Könnte man das Verhalten auch durch Konfiguration ändern?
>
> s.o.: Constraints und Transaktionen haben nicht direkt etwas
> miteinander zu tun. Also sollte die DB sie wohl sofort prüfen.

Ok.
Je nach Isolation-Level sind natürlich "böse" Inserts nicht zu
akzeptieren, aber bei Isolation-Level "Serializable" könnte
das DBMS auch erst beim commit prüfen, oder?

Grüße
Michael

Re: Primarykey-Contraint check bei "insert" oder "commit"?

am 31.07.2006 11:21:43 von Christian Kirsch

Michael Konietzka schrieb:
> Christian Kirsch schrieb:
>> Michael Konietzka schrieb:
>>> Hi
>>>
>>> MySQL-Version;: 4.0.28 standard
>>> TableTyp: InnoDB
>>>
>>> Wann wird bei einer Insert-Operation die Überprüfung des
>>> Constraints gemacht?
>>>
>>> Bsp:
>>> Ich füge einen Datensatz ein, welcher den Primarykey-Constraints
>>> verletzen würde. Meldet daß die MySQL sofort nach einfügen oder
>>> erst beim commit?
>> Was meinst Du mit "Primary Key Constraint verletzen" - den Versuch,
>> einen Datensatz mit einem PK einzufügen, der schon existiert?
>
> Exakt.
>
>> Was spricht dagegen, das auszuprobieren?
>
> Nix, aber [...]

> Mich interessiert zudem, ob das im SQL-Standard spezifiziert wäre und
> ob MySQL das zb vielleicht je nach Isolationlevel anders handhabt.
>

Na, dann lese ich mal vor: "A primary key constraint makes it
impossible to bommit any operation that would cause the unique key to
contain any NULLs or any duplicate values."
(Peder Gulutzan & Trudy Pelzer; SQL-99 Complete, Really; R&D Books;
Lawrence, Kansas, o.J., ISBN 0-87930-568-1)

MaW: Wenn das in einer Transaktion läuft, scheitert das COMMIT. Sonst
schon das INSERT, denn da ist MySQL im Auto-COMMIT-Mode, IIRC.