Frage

Ok, weg von die letzte Frage, die ich fragte , Wie funktioniert Mysql das wo statment im folgenden Code behandeln:

DELIMITER ;//
DROP PROCEDURE IF EXISTS `test`;//
CREATE PROCEDURE `test`
(
  id INT
)
BEGIN
  SELECT *
    FROM some_table
   WHERE id = id;
END;//

Was ist MySQL in diesem Fall tun? Ist es die where-Klausel als

behandeln
some_table.id = id

oder hat sie behandeln sie wie

some_table.id = some_table.id 

Im Moment mache ich so etwas wie

WHERE id = @id

, weil ich nicht wusste, dass es Session-Variablen in MySQL waren und es beschwerte sich nicht, und ich dachte, dass es eine explizite Art zu sagen, „wo diese Spalte entspricht diese Variable“.

Man könnte sagen, „duh .. natürlich ist es behandelt sie als column = Variable“ aber ich hätte leicht gesagt, wo „Variable = Spalte.“ Wie funktioniert es damit umgehen?

War es hilfreich?

Lösung

MySQL Variable Namensschema ist ein bisschen komisch, wenn der erste Blick hinein hat. Im Allgemeinen MySQL unterscheidet drei Arten von Variablen:

  • Systemvariablen ( global oder < a href = "http://dev.mysql.com/doc/refman/5.0/en/server-session-variables.html" rel = "noreferrer"> Sitzung scoped): @@varname
  • Benutzer definiert Variablen (sie sind Sitzungs-Zielbereichs ): @varname
  • lokales Variablen in gespeicherten Programme: varname

So Namenskonflikte, wie diejenigen, die Sie oben erwähnt, nur in gespeicherten Programmen entstehen. Daher sollten Sie zunächst versuchen, diese Namenskonflikte zu vermeiden, indem sie eindeutige Parameternamen zuweisen, zum Beispiel durch die Parameter mit p wie pId prefxing. Wenn MySQL eine Zweideutigkeit begegnet wird es die Referenz als Name einer Variablen ( siehe hier ):

  

[...] Lokalvariablennamen sollten nicht   das gleiche sein wie Spaltennamen. Wenn eine SQL   Erklärung, wie ein SELECT ... INTO   Anweisung enthält einen Verweis auf eine   Spalte und eine deklarierte lokale Variable   mit dem gleichen Namen, MySQL zur Zeit   interpretiert die Referenz als Name   eine Variablen. [...]

Der Wortlaut zur Zeit gibt irgendwie den Eindruck, dass dieses Verhalten in zukünftigen Versionen ändern könnte.

Andere Tipps

Ich bin mir ziemlich sicher, dass das @ bedeutet, dass es sich um eine Variable in dem Verfahren ist, anstatt eine Spalte der Tabelle zu verweisen. Es gibt nur eine Tabellenspalte namens id, so in diesem Fall ist es eindeutig. Wenn Sie eine Verknüpfung taten, dann würden Sie brauchen, um es Prefix:

select *
from table1, table2
where table1.id = @id
and table2.some_field = table1.id

Es spielt keine Rolle, wo es ist, wird die Variable erfordert immer das Präfix @, wie in dieser Abfrage:

select id, @id
from table1

die erste ID ist die eindeutige Tabellenspalte table1.id und der @id verweist auf die gespeicherte Prozedur Variable.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top