#php #mysql
#php #mysql
Вопрос:
Я пытаюсь установить автоматическое увеличение st_id моих таблиц на = 201406001
запрос:
ALTER TABLE
support_ticket AUTO_INCREMENT=201406001
При этом это сработало, и теперь мой «st_id» (AI, первичный ключ) установлен на 201406001, как я и хотел.
Когда я запустил этот запрос, он сказал, что это повлияло на 4 строки, что правильно, потому что в таблице было 4 строки, когда я запускал этот запрос.
Но теперь, когда я пытаюсь обновить статус определенного столбца в одной из этих 4 строк, он не обновляется.
Является ли мой запрос ALTER TABLE неправильным?
Я попытался выполнить следующий запрос, чтобы настроить таргетинг только на st_id, подобный этому, но выдал ошибку.
ALTER TABLE
support_ticket.st_id AUTO_INCREMENT=201406001
FROM
support_ticket
ОШИБКА
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM
support_ticket' at line 3
Итак, мой вопрос в том, должен ли я придерживаться своего исходного запроса, поскольку он работал, или я должен попытаться заставить 2-й запрос работать?
Кроме того, может ли выполнение этого 1-го запроса быть причиной того, что я не могу обновить свой столбец сейчас?
Я впервые использую ALTER TABLE, поэтому любая помощь будет полезна.
Вот мой код обновления: Форма
<form method="POST" action="close.php" enctype="multipart/form-data">
<input type="hidden" name="st_id" value="<?php echo escape ($t->st_id); ?>">
<h3>Close this ticket...</h3>
<select name="status">
<option value="<?php echo escape($t->status); ?>">Current Status: OPEN</option>
<option value="0">CLOSE</option>
</select>
<input type="submit" value="CLOSE"><input type="button" value="Cancel" onclick="window.location = '/admin/maintenance/'">
</form>
Сценарий действия:
include($_SERVER['DOCUMENT_ROOT'] . "/core/init.php");
$st_id = $_POST['st_id'];
$status = $_POST['status'];
$updatestatus = DB::getInstance()->UPDATE('support_ticket', $st_id, array(
'status' => $status,
));
echo "The ticket was successfully closed.<br />
Решение моей проблемы с ОБНОВЛЕНИЕМ:
Наконец-то получил его для обновления этим:
$st_id = $_POST['st_id'];
$status = $_POST['status'];
$updatestatus = DB::getInstance()->query("UPDATE `support_ticket` SET `status` = $status WHERE `st_id` = $st_id");
Комментарии:
1. Мой st_id является единственным авто_инкрементом в таблице
2. @user0000000 может ли выполнение запроса повлиять на мою способность обновлять столбцы? Я на 99% уверен, что мой код обновления верен.
3. вопрос 2) вы хотите установить st_id = 201406001?
4. @user0000000 смотрите в верхней части страницы для ОБНОВЛЕНИЯ
5. Тот, который выдает вам ошибку, разве это не должно быть похоже на
ALTER TABLE tablename MODIFY COLUMN column_name...
?
Ответ №1:
Кажется, что пробная версия автоматически увеличивается в зависимости от года или месяца. Вы можете использовать пользовательские значения AUTO_INCREMENT MySQL следующим образом: (сначала прочитайте статью)
Я изменил функцию getNextCustomSeq
на строку:
SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,'0')));
Для
SET @ret = (SELECT concat(sSeqGroup,lpad(nLast_val,3,'0')));
Затем я создаю таблицу, и триггеры следуют:
CREATE TABLE ticket(
id int not null primary key auto_increment,
autonum int not null
);
DELIMITER $$
CREATE TRIGGER ticket_autonums_bi BEFORE INSERT ON ticket
FOR each ROW
BEGIN
SET NEW.autonum = getNextCustomSeq(date_format(now(),'%Y%m'),date_format(now(),'%Y%m'));
END$$
delimiter ;
Примечание: функция date_format(now(),'%Y%m')
вернет текущий год и mont как «201406»
Теперь вставьте некоторые значения:
insert into ticket(id)
values (null),(null),(null),(null),(null),
(null),(null),(null),(null),(null);
Выберите вставленные данные:
mysql> select * from ticket;
---- -----------
| id | autonum |
---- -----------
| 1 | 201406001 |
| 2 | 201406002 |
| 3 | 201406003 |
| 4 | 201406004 |
| 5 | 201406005 |
| 6 | 201406006 |
| 7 | 201406007 |
| 8 | 201406008 |
| 9 | 201406009 |
| 10 | 201406010 |
---- -----------
10 rows in set (0.00 sec)
Комментарии:
1. с этого момента в начале каждого месяца нам придется запускать этот запрос ALTER TABLE, чтобы присвоить st_id новый st_id для этого месяца. Т.Е. в следующем месяце мы запустим его снова, и это будет 201407001 = 2014 Год 07 Месяц 001 Номер билета. Читая это, вы говорите, что мыможно ли автоматически генерировать st_id каждый месяц для обновления года / даты / 001? Если это так, это было бы очень полезным решением, поэтому нам не нужно вручную делать это каждый месяц. К вашему сведению, это для системы обращений в службу поддержки. Вот почему нам нужен такой набор st_id. Мы используем его для запроса #
Ответ №2:
ALTER TABLE ... AUTO_INCREMENT=201406001
только означает, что следующее сгенерированное значение AI будет этим значением. Это не изменяет значение идентификатора ни в одной из текущих строк данных в таблице.
Сообщение «Затронутые строки» означало, что он выполнил копирование таблицы как часть ALTER TABLE. Некоторые старые версии MySQL наивно копировали все строки в таблице, даже если вы не думали, что это необходимо для изменения метаданных.
Поэтому, если вы попытаетесь UPDATE ... WHERE id=201406001
, это не будет применяться к вашим существующим строкам.
Комментарии:
1. Итак, вы говорите, что из-за того, что я запустил этот запрос, я не могу обновить существующие строки?
2. Я говорю, что идентификаторы существующих строк не изменились в результате изменения таблицы, поэтому вам придется использовать «старые» значения в предложении WHERE, а не любое значение 201406001 или больше.
Ответ №3:
При ALTER
этом вы обновляете описание таблицы (т.Е. Имена столбцов, значения для автоинкремента).
Если вы хотите обновить значения таблицы, вы должны использовать UPDATE
. ie:
UPDATE support_ticket SET status = 'closed' WHERE id = 1234;
Если вы новичок в SQL, взгляните на w3schools.com . у них есть несколько руководств (http://www.w3schools.com/sql/sql_update.asp )
Комментарии:
1. Обновил ее, выполнив следующее: Мое решение для обновления см. вверху. @chresse