2009-06-18 8 views
1

Ok, das weg von the last question I asked, Wie geht Mysql das wo statment in dem folgenden Code:MySQL: @ Variable vs. Variable. Was ist der Unterschied? (Teil2)

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? Hat behandeln sie die where-Klausel als

some_table.id = id 

oder es ist behandeln sie wie

some_table.id = some_table.id 

Im Moment habe ich etwas tue, wie

WHERE id = @id 

, weil ich nicht wusste, dass es Session-Variablen in MySQL und es hat sich nicht beschweren und ich dachte, dass es eine explizite Art zu sagen "wo diese Spalte diese Variable ist".

Einige könnten sagen "Duh .. natürlich behandelt es als Spalte = Variable" aber ich hätte leicht sagen können, wo "Variable = Spalte." Wie geht es damit um?

Antwort

11

Das variable Benennungsschema von MySQL ist ein bisschen komisch, wenn man es zuerst betrachtet. Im Allgemeinen MySQL unterscheidet drei Arten von Variablen:

  • Systemvariablen (global oder session scoped): @@varname
  • user defined Variablen (sie werden Sitzung scoped): @varname
  • local Variablen in gespeicherten Programmen: varname

Namenskonflikte, wie die oben erwähnten, treten nur innerhalb gespeicherter Programme auf. Daher sollten Sie zuerst versuchen, diese Namenskonflikte zu vermeiden, indem Sie eindeutige Parameternamen z. durch Voreinstellung der Parameter mit wie pId. Wenn MySQL eine Zweideutigkeit begegnet wird es die Referenz als Name einer Variablen (see here) interpretieren:

[...] Lokalvariablennamen sollten nicht die gleiche wie Spaltennamen sein.Wenn eine SQL-Anweisung , wie eine SELECT ... INTO Anweisung enthält einen Verweis auf eine Säule und eine deklarierte lokale Variable mit dem gleichen Namen, MySQL derzeit die Referenz als Name einer Variablen interpretiert. [...]

Die Formulierung derzeit gibt irgendwie den Eindruck, dass dieses Verhalten in zukünftigen Versionen ändern könnte.

0

Ich bin mir ziemlich sicher, dass das @ bedeutet, dass es eine Variable in der Prozedur ist, anstatt auf eine Tabellenspalte zu verweisen. Es gibt nur eine Tabellenspalte mit dem Namen id, daher ist sie in diesem Fall eindeutig. Wenn Sie eine Verknüpfung taten, dann müssten Sie es Präfix:

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

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

select id, @id 
from table1 

Die erste ID ist die unzweideutige Tabellenspalte table1.id, und die @id verweist auf die gespeicherte Prozedurvariable.

+0

Ich bin mir nicht sicher, ob das stimmt. Sehen Sie sich die andere Frage an, auf die ich in dieser Frage Bezug genommen habe. Der Typ, der antwortete, dass @ nur eine Sitzungsvariable bezeichnet. – DJTripleThreat

+0

In diesem Fall ist die gespeicherte Prozedur synonym mit der Sitzung. – FryGuy