Как обновить или вставить данные из родительской таблицы в дочернюю таблицу? - PullRequest
0 голосов
/ 06 мая 2019

Хорошо, поэтому я пытаюсь обдумать, как к этому подойти, но у нас есть две таблицы, где таблица Book является родительской таблицей таблицы Author, а таблица Author использует два внешних ключа из таблицы book, а затем имеет тристолбцы для авторов имя, отчество и фамилия;Сначала, когда я ввожу в книгу информацию, как мне обновить таблицу авторов с тем же номером isbn и номером копии?при вставке значений в столбцы AF, AM, AL?

VALUES ("1234567980605", 2, "Chaos Theory", "Mathematics", 19900910, "Steven Stugart", 450);
INSERT INTO AUTHOR (isbn, copy) SELECT ISBN FROM BOOK;
INSERT INTO AUTHOR (AF, AM, AL) VALUES ("Tony", "W", "Stark");

Это был запрос, который я создал, думая, что он будет работать, но он не работал.

Таблица BOOK

+---------------+------+----------------+-------------+------------+-------------------+------+
|     ISBN      | COPY |     TITLE      |    GENRE    |   PDATE    |     PUBLISHER     | SIZE |
+---------------+------+----------------+-------------+------------+-------------------+------+
| 1111111111111 |    1 | Calculus AB BC | Math        | 2000-01-02 | Pearson Education |  325 |
| 1111111111111 |    2 | Calculus AB BC | Math        | 2000-01-02 | Pearson Education |  325 |
| 1112223334445 |    2 | Test           | tst         | 2019-05-05 | testaa            |  123 |
| 1212365454789 |    1 | Math           | Mathematics | 2000-02-02 | Pearson Education |  450 |
+---------------+------+----------------+-------------+------------+-------------------+------+

Таблица AUTHOR

+---------------+------+--------+----+---------+
|     isbn      | copy |   AF   | AM |   AL    |
+---------------+------+--------+----+---------+
| 1111111111111 |    1 | John   | M  | Smith   |
| 1111111111111 |    2 | John   | M  | Smith   |
| 1231231231231 |    1 | Peyton | M  | Manning |
+---------------+------+--------+----+---------+

Ожидаемые результаты:

VALUES ("1234567980605", 2, "Chaos Theory", "Mathematics", 19900910, "Steven Stugart", 450);
INSERT INTO AUTHOR (isbn, copy) SELECT ISBN FROM BOOK;
INSERT INTO AUTHOR (AF, AM, AL) VALUES ("Tony", "W", "Stark");

Книжный стол

+---------------+------+----------------+-------------+------------+-------------------+------+
|     ISBN      | COPY |     TITLE      |    GENRE    |   PDATE    |     PUBLISHER     | SIZE |
+---------------+------+----------------+-------------+------------+-------------------+------+
| 1111111111111 |    1 | Calculus AB BC | Math        | 2000-01-02 | Pearson Education |  325 |
| 1111111111111 |    2 | Calculus AB BC | Math        | 2000-01-02 | Pearson Education |  325 |
| 1112223334445 |    2 | Test           | tst         | 2019-05-05 | testaa            |  123 |
| 1212365454789 |    1 | Math           | Mathematics | 2000-02-02 | Pearson Education |  450 |
| 1234567980605 |    2 | Chaos Theory   | Mathematics | 1990-09-10 | Steven Stugart    |  450 |
+---------------+------+----------------+-------------+------------+-------------------+------+

Автор Таблица

+---------------+------+--------+----+---------+
|     isbn      | copy |   AF   | AM |   AL    |
+---------------+------+--------+----+---------+
| 1111111111111 |    1 | John   | M  | Smith   |
| 1111111111111 |    2 | John   | M  | Smith   |
| 1231231231231 |    1 | Peyton | M  | Manning |
| 1234567980605 |    2 | Tony   | W  | Stark   |
+---------------+------+--------+----+---------+

1 Ответ

0 голосов
/ 06 мая 2019

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

CREATE TABLE `test`.`book` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `isbn` VARCHAR(100) NOT NULL,
  `copy` INT NULL,
  `gener` VARCHAR(45) NULL,
  `title` VARCHAR(100) NULL,
  `pdate` DATETIME NULL,
  `publisher` VARCHAR(45) NULL,
  `size` INT NULL DEFAULT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

CREATE TABLE `test`.`author` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `book_id` INT NULL,
  `af` VARCHAR(45) NULL,
  `am` VARCHAR(45) NULL,
  `al` VARCHAR(45) NULL,
  PRIMARY KEY (`id`),
  INDEX `author_book_id_idx` (`book_id` ASC),
  CONSTRAINT `author_book_id`
    FOREIGN KEY (`book_id`)
    REFERENCES `test`.`book` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


INSERT INTO `book` (`id`, `isbn`, `copy`, `gener`, `title`, `pdate`, `publisher`, `size`) VALUES (NULL, 'test2', '2', 'math', 'test2', '2019-05-06 00:00:00', 'test', '2');

insert into author (`book_id`,`af`,`am`,`al`) select max(id),'test af','test am','test al' from book; 

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

CREATE TABLE `test`.`book` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `isbn` VARCHAR(100) NOT NULL,
  `copy` INT NULL,
  `gener` VARCHAR(45) NULL,
  `title` VARCHAR(100) NULL,
  `pdate` DATETIME NULL,
  `publisher` VARCHAR(45) NULL,
  `size` INT NULL DEFAULT NULL,
`author_id` INT NULL,
  PRIMARY KEY (`id`)),
CONSTRAINT `author_book_id`
    FOREIGN KEY (`author_id`)
    REFERENCES `test`.`author` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

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

ALTER TABLE `test`.`book` 
ADD COLUMN `created_at` DATETIME NULL AFTER `size`;

и вставка должна выглядеть как

insert into author (`isbn`, `copy`,`af`,`am`,`al`) select isbn, copy,'test af','test am','test al' from book where created_at=(select max(created_at) from book );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...