Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ограничение даты в БД / 12 сообщений из 12, страница 1 из 1
02.07.2018, 18:37
    #39668492
Kra-MaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
Есть задание:
Создать таблицу в которо при вставке данных (даты в поле Дата)
должна проходить проверка дата в пределах от 1.1.2000 до 31.12.2020
Никак не получается реализовать.
Может кто поможет?

CREATE TABLE table1(
id INT(11) NOT NULL AUTO_INCREMENT,
DateOf date NOT NULL,
PRIMARY KEY (id))
ENGINE = MYISAM
AUTO_INCREMENT=1
CHARACTER SET UTF8mb4
COLLATE utf8mb4_general_ci,

Create function 'Date_FN'()
Returns TEXT
AS
BEGIN
Declare @DATE_t Data,
if 'DateOf'>'2000/01/01'
then @DATE_t='DateOf'
else Return 'is invalid Data',

if @DATE_t<'2020/12/30'
then INSERT INTO table1 (DateOf)
VALUES (@DATE_t)
else Return 'is invalid Data',
End,

А как теперь сюда прикрутить тригер???
...
Рейтинг: 0 / 0
02.07.2018, 19:42
    #39668499
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
А нафига триггер? Функции, вроде, вполне достаточно.
...
Рейтинг: 0 / 0
03.07.2018, 13:36
    #39668780
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
А check constraint не справится?..
...
Рейтинг: 0 / 0
03.07.2018, 15:01
    #39668862
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
Dimitry SibiryakovА check constraint не справится?Reference ManualThe CHECK clause is parsed but ignored by all storage engines.

Kra-MaXпри вставке данных (даты в поле Дата) должна проходить проверка дата в пределах от 1.1.2000 до 31.12.2020Ну что при прохождении проверки запись помещается в таблицу, мы типа догадались...
А что делать, если проверка не прошла? поменять на некую дефолтную? на некую вычисляемую из введённого значения? сгенерировать ошибку?
А что делать, если не является валидной датой?
А если введённое значение вообще не может быть приведено к типу даты?
А если Null?
...
Рейтинг: 0 / 0
04.07.2018, 09:32
    #39669256
Kra-MaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
vkleА нафига триггер? Функции, вроде, вполне достаточно.
Тригер отрабатывает по условию "До вставки данных" автоматически!!!

А функция запускается руками.
...
Рейтинг: 0 / 0
04.07.2018, 09:33
    #39669258
Kra-MaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
AkinaDimitry SibiryakovА check constraint не справится?Reference ManualThe CHECK clause is parsed but ignored by all storage engines.

Kra-MaXпри вставке данных (даты в поле Дата) должна проходить проверка дата в пределах от 1.1.2000 до 31.12.2020Ну что при прохождении проверки запись помещается в таблицу, мы типа догадались...
А что делать, если проверка не прошла? поменять на некую дефолтную? на некую вычисляемую из введённого значения? сгенерировать ошибку?
А что делать, если не является валидной датой?
А если введённое значение вообще не может быть приведено к типу даты?
А если Null?

Любые другие данные не валидные описаны в функции и возвращают 'is invalid Data'"
...
Рейтинг: 0 / 0
04.07.2018, 11:42
    #39669359
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
mysql> CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, dt DATE);
Query OK, 0 rows affected (0.41 sec)

mysql> DELIMITER @@;

mysql> CREATE TRIGGER tr_bi
    -> BEFORE INSERT ON test
    -> FOR EACH ROW
    -> BEGIN
    ->     IF new.dt < '2001-01-01' OR new.dt >= '2020-01-01' THEN
    ->         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Wrong date entered.';
    ->     END IF;
    -> END;
    -> @@;
Query OK, 0 rows affected (0.11 sec)

mysql> DELIMITER ;

mysql> INSERT INTO test (dt) VALUES ('2010-01-01');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO test (dt) VALUES ('2030-01-01');
ERROR 1644 (45000): Wrong date entered.

mysql> INSERT INTO test (dt) VALUES ('2000-01-01');
ERROR 1644 (45000): Wrong date entered.

mysql> SELECT * FROM test;
+----+------------+
| id | dt         |
+----+------------+
|  1 | 2010-01-01 |
+----+------------+
1 row in set (0.00 sec)

mysql>
...
Рейтинг: 0 / 0
05.07.2018, 10:46
    #39669873
Kra-MaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
Akina
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
mysql> CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, dt DATE);
Query OK, 0 rows affected (0.41 sec)

mysql> DELIMITER @@;

mysql> CREATE TRIGGER tr_bi
    -> BEFORE INSERT ON test
    -> FOR EACH ROW
    -> BEGIN
    ->     IF new.dt < '2001-01-01' OR new.dt >= '2020-01-01' THEN
    ->         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Wrong date entered.';
    ->     END IF;
    -> END;
    -> @@;
Query OK, 0 rows affected (0.11 sec)

mysql> DELIMITER ;

mysql> INSERT INTO test (dt) VALUES ('2010-01-01');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO test (dt) VALUES ('2030-01-01');
ERROR 1644 (45000): Wrong date entered.

mysql> INSERT INTO test (dt) VALUES ('2000-01-01');
ERROR 1644 (45000): Wrong date entered.

mysql> SELECT * FROM test;
+----+------------+
| id | dt         |
+----+------------+
|  1 | 2010-01-01 |
+----+------------+
1 row in set (0.00 sec)

mysql>



Спасибо огромное. Почти отлично ((
При попытке создать тригер валится ошибка ((
10:44:54 CREATE TRIGGER tr_bi BEFORE INSERT ON test FOR EACH ROW BEGIN IF new.dt < '2001-01-01' OR new.dt >= '2020-01-01' THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Wrong date entered.'; END IF; END; Error Code: 1054. Unknown column 'dt' in 'NEW' 0.000 sec
...
Рейтинг: 0 / 0
05.07.2018, 12:19
    #39669963
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
А поменять имена полей на свои не пробовал?
...
Рейтинг: 0 / 0
05.07.2018, 14:39
    #39670060
Kra-MaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
vkleА нафига триггер? Функции, вроде, вполне достаточно.

Я полностью создаю таблицу по вашему примеру - добьюсь корректной работы и тогда буду адаптировать. Я новичек - сразу нужно понять принцип - потом ломать)))
...
Рейтинг: 0 / 0
05.07.2018, 14:40
    #39670061
Kra-MaX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
AkinaА поменять имена полей на свои не пробовал?
Я полностью создаю таблицу по вашему примеру - добьюсь корректной работы и тогда буду адаптировать. Я новичек - сразу нужно понять принцип - потом ломать)))
...
Рейтинг: 0 / 0
05.07.2018, 15:49
    #39670137
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение даты в БД
Kra-MaXЯ полностью создаю таблицу по вашему примеруТогда покажите полностью то, что у Вас получается, так же, как у меня, процитируйте с консоли от CREATE TABLE и до сообщения об ошибке включительно. В теге SRC, есссно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ограничение даты в БД / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]