2009-05-14 14 views
7

Powiedzmy, że mamy procedurę składowaną SetCustomerName, która ma parametr wejściowy Nazwa i mam klientów tabeli z nazwą kolumny. Więc wewnątrz mojej procedury przechowywanej chcę ustawić nazwę klienta. Jeśli piszęMySQL: Gdy nazwa parametru procedury składowanej jest taka sama, jak nazwa kolumny tabeli

UPDATE customers SET Name = Name;

to jest błędne i widzę 2 inne sposoby:

UPDATE customers SET Name = `Name`; 
UPDATE customers SET customers.Name = Name;

Pierwszy z nich działa, ale nie mogę znaleźć w dokumentacji, że mogę owinąć parametrów wewnątrz `znaków. A może brakowało mi go w dokumentacji (link jest w tym przypadku mile widziany).

Jakie są inne sposoby i jaki jest standardowy sposób postępowania w takim przypadku? Zmiana nazwy parametru wejściowego nie jest dla mnie dobra (ponieważ mam automatyczne mapowanie obiektowo-relacyjne, jeśli wiesz, co mam na myśli).

UPDATE:

Tak, istnieje związek o backticks (http://dev.mysql.com/doc/refman/5.0/en/identifiers.html), ale to nie wyjaśnia dostatecznie głęboko, jak z nich korzystać (jak z nich korzystać z parametrów i nazwy kolumn).

I jest bardzo dziwne rzeczy (przynajmniej dla mnie): Można użyć backticks obu kierunkach:

UPDATE customers SET Name = `Name`; 
//or 
UPDATE customers SET `Name` = Name; 
//or even 
UPDATE customers SET `Name` = `Name`;

i wszystkie one działają absolutnie tak samo.

Nie uważasz, że to dziwne? Czy to dziwne zachowanie zostało wyjaśnione?

Odpowiedz

4

Myślę, że pierwszym przykładem jest rzeczywiście tyłu. Jeśli próbujesz ustawić „Nazwa” kolumny „Nazwa” parametru wejściowego, wierzę, powinno być:

UPDATE customers SET `Name` = Name; 

I za drugim przykładzie, można ustawić stół aliasy ten sam sposób, co robisz we wszystkich innych stwierdzeń:

UPDATE customers AS c SET c.Name = Name; 
0

lub użyć coś takiego:

BEGIN 
set @m_query = concat('update users set ',column,' = \'', value,'\' where id = ',user); 

prepare stmt from @m_query; 
execute stmt; 

END 

kolumna & wartość są TEKST użytkownika są INT

+1

** Nie rób tego! ** Czy na prawdę chcesz skonstruować SQL używając konkatenacji ciągów znaków? A co z iniekcją SQL? – ADTC

+0

@ADTC, żartujesz? Aby uruchomić tę procedurę przechowywaną, musisz już być w podsystemie SQL. Dlatego możesz uruchomić dowolne zapytanie. PLUS to jest przygotowane oświadczenie. Jedną z głównych zalet przygotowanych instrukcji jest to, że zapobiegają iniekcji SQL. –

+0

Jeśli łączysz łańcuchy, aby utworzyć wyciąg, "przygotuj" go (bez żadnych parametrów), to nie jest przygotowana instrukcja, to tylko instrukcja udająca przygotowanie. – ADTC

14

Najprostszym sposobem rozróżnienia między parametrem a kolumną (jeśli obie nazwy są takie same) jest dodanie nazwy tabeli do nazwy kolumny.

UPDATE customers SET customers.Name = Name; 

Nawet można również dodać przedrostek bazy danych jak

UPDATE yourdb.customers SET yourdb.customers.Name = Name; 

Dodając nazwę bazy danych można wykonywać działania na więcej niż 1 bazy danych z procedury jednego sklepu.

+1

To powinno być oznaczone jako odpowiedź, Dzięki. – ykh