Heim >Datenbank >MySQL-Tutorial >Warum schlagen MySQL CHECK-Einschränkungen in Versionen vor 8.0.16 fehl?

Warum schlagen MySQL CHECK-Einschränkungen in Versionen vor 8.0.16 fehl?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-10 10:43:43314Durchsuche

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

MySQL CHECK-Einschränkungsfehlerproblem

Beim Definieren von Datenbanktabellen ist es wichtig, Einschränkungen hinzuzufügen, um die Datenintegrität sicherzustellen. Mit CHECK-Einschränkungen können Sie Bedingungen angeben, die die Werte einer bestimmten Spalte erfüllen müssen. In MySQL 8.0.15 und früher werden CHECK-Einschränkungen jedoch nicht erzwungen, was einen Sonderfall darstellt.

Beispiel:

<code class="language-sql">CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);</code>

Versuchen Sie nach dem Erstellen dieser Tabelle, Zeilen mit negativen SD-Werten einzufügen:

<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>

MySQL meldet keinen Fehler, selbst wenn der eingefügte Wert gegen die angegebene CHECK-Einschränkung verstößt. Dies liegt daran, dass laut MySQL-Referenzhandbuch:

<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>

Lösung:

Um dieses Problem zu beheben, können Sie einen der folgenden Schritte ausführen:

  • Upgrade auf MySQL 8.0.16 oder höher: Diese Version beginnt mit der Unterstützung von CHECK-Einschränkungen. Weitere Einzelheiten finden Sie in der MySQL-Dokumentation.
  • Trigger implementieren: Trigger können verwendet werden, um Einschränkungen zu erzwingen, die die Speicher-Engine ignoriert. Durch das Erstellen eines Triggers, der den SD-Wert vor dem Einfügen überprüft, wie unten gezeigt, kann die Einschränkung effektiv durchgesetzt werden:
<code class="language-sql">mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD <=0 THEN SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;</code>

Bitte beachten Sie, dass das obige Triggerbeispiel den SD-Wert negativer Zahlen auf 0 setzt. Sie können die Triggerlogik entsprechend Ihren tatsächlichen Anforderungen ändern.

Das obige ist der detaillierte Inhalt vonWarum schlagen MySQL CHECK-Einschränkungen in Versionen vor 8.0.16 fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn