каскадные обновления в таблицах mysql - PullRequest
0 голосов
/ 03 ноября 2011

Я пытался обернуть голову вокруг этого, но безуспешно.

В основном я пытаюсь создать базу данных, содержащую только две таблицы.Первая таблица является таблицей логинов и содержит столбцы:

User ID
Username
Password
First Name
Last Name

Вторая таблица является таблицей голосования и содержит столбцы:

User ID
Vote 1
Vote 2
Vote 3

и т. Д.и т. д.

В любом случае я могу связать эти таблицы с идентификатором пользователя в качестве первичного ключа, который может каскадно обновлять / удалять, так что, когда я добавляю запись в таблицу логинов, она автоматически создает записьв таблице голосов с тем же идентификатором пользователя и значением по умолчанию для всех столбцов голосования?

Я мог бы добавить голоса в основную таблицу, но хотел бы разделить их как можно больше, так как не всесоздавать голоса.

Большое спасибо Eds

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

Если вы хотите каскадно обновлять, вам нужно использовать транзакцию:

START TRANSACTION;

INSERT INTO logins (username, passhash, salt, `first name`, `last name`)
  VALUES ('$username', SHA2(CONCAT('$salt','$password'),512), '$salt',
          '$firstname', '$lastname');
SELECT @userid:= LAST_INSERT_ID();
INSERT INTO votes (userid) VALUES (@userid);

COMMIT;

Убедитесь, что в определении таблицы для голосования установлены значения по умолчанию.

Обратите внимание на использование соленых хэшированных паролей.

0 голосов
/ 03 ноября 2011

Вы можете указать триггер вставки в таблицу logins.

Это будет выполняться каждый раз, когда строка вставляется в таблицу logins. Вы можете указать, что вы хотите сделать триггер. В этом случае вы можете создать триггер для вставки одной строки в таблицу vote, используя только что созданный идентификатор в таблице login и значения по умолчанию.

Так что-то вроде:

CREATE TRIGGER logins_default_vote AFTER INSERT ON logins
FOR EACH ROW
INSERT INTO vote (UserID,Vote1,Vote2,Vote3) 
VALUES (NEW.UserId,'vote1 default','vote2 default','vote3 default');
...