Оператор SQL At-Sign перед именем столбца - PullRequest
9 голосов
/ 29 августа 2011

У меня есть оператор INSERT в PHP-файле, в котором перед именем столбца встречаются знаки (@).

@ field1, @ Field2,

Это база данных MySQL. Что означает знак «at»?

Edit:
В скрипте PHP нет SET @field1 := 'test'. Сценарий PHP читает CSV и помещает данные в таблицу. Может ли он быть неправильно использован как функция комментирования?

<?php
$typo_db_username = 'xyz';  //  Modified or inserted by TYPO3 Install Tool.
$typo_db_password = 'xyz';  //  Modified or inserted by TYPO3 Install Tool.

// login
$_SESSION['host'] = "localhost";
$_SESSION['port'] = "3306";
$_SESSION['user'] = $typo_db_username;
$_SESSION['password'] = $typo_db_password;
$_SESSION['dbname'] = "database";


$cxn = mysqli_connect($_SESSION['host'], $_SESSION['user'], $_SESSION['password'], $_SESSION['dbname'], $_SESSION['port']) or die ("SQL Error:" . mysqli_connect_error() );
mysqli_query($cxn, "SET NAMES utf8");

$sqltrunc = "TRUNCATE TABLE tablename";
$resulttrunc = mysqli_query($cxn,$sqltrunc) or die ("Couldn’t execute query: ".mysqli_error($cxn));

$sql1 = "
LOAD DATA LOCAL
INFILE 'import.csv'
REPLACE
INTO TABLE tablename
FIELDS
TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '\"'
IGNORE 1 LINES
(
`normalField`,
@field1,
@field2,
`normalField2`,
@field3,
@field4
)";

$result1 = mysqli_query($cxn,$sql1) or die ("Couldn’t execute query: " . mysqli_error($cxn));


?>'

РЕШЕНИЕ

Наконец-то я это выяснил! Поле @ используется как пустышка, чтобы пропустить столбец в csv-файле. См. http://www.php -resource.de / forum / showthread / t-97082.html http://dev.mysql.com/doc/refman/5.0/en/load-data.html

1 Ответ

10 голосов
/ 29 августа 2011

Знак @ является переменной в SQL.

В MySQL он используется для хранения значения между последовательными запусками запроса или для передачи данных между двумя различными запросами.

Пример

Передача данныхмежду двумя запросами

SELECT @biggest:= MAX(field1) FROM atable;
SELECT * FROM bigger_table WHERE field1 > @biggest;

Другое использование - ранжирование, для которого MySQL не имеет встроенной поддержки.

Сохранение значения для последовательных прогонов запроса

INSERT INTO table2
  SELECT @rank := @rank + 1, table1.* FROM table1
  JOIN( SELECT @rank := 0 ) AS init
  ORDER BY number_of_users DESC

Обратите внимание, что для того, чтобы это работало, порядок, в котором строки обрабатываются в запросе, должен быть исправлен, легко ошибиться.

См .:
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
MySQL сортировка и ранжирование
http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

ОБНОВЛЕНИЕ
Этот код никогда не будет работать.
Вы только что открыли соединение раньше, и нигде не установлены @fields.
Так что в настоящее время они содержат null значений.
Кроме того, вы не можете использовать @vars для обозначения имен полей , вы можете только использовать @vars для значений.

$sql1 = "
LOAD DATA LOCAL INFILE 'import.csv'
REPLACE INTO TABLE tablename
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'
IGNORE 1 LINES
(`normalField`, @field1, @field2, `normalField2`, @field3, @field4)";
...