sql >> Databáze >  >> RDS >> Mysql

Je v tomto případě nutná normalizace?

Vzhledem k vaší otázce týkající se aktualizací je aktualizovaná odpověď:

Opravdu nevidím žádnou výhodu v rozdělení této tabulky

id | some_unique_field | name | sex | university

Rozhodně byste měli tuto tabulku rozdělit:

id | fundraiser_id | donation_amount | name | sex | university

Do tohoto:

donation
id | fundraiser_id | donation_amount | donator_id

fundraiser
id | charity | ....

donator
id | name | sex | university

To usnadní získání darované částky na osobu.

Pokud chcete importovat svou tabulku, doporučuji udělat něco takového:

Krok 1:Vytvořte tabulku černých děr takto:

DROP TABLE IF EXISTS `test`.`bh_donations`;
CREATE TABLE  `test`.`bh_donations` (
  `fundraiser_name` varchar(45) NOT NULL,
  `donation_amount` decimal(10,2) NOT NULL,
  `name` varchar(45) NOT NULL,
  `sex` char(1) NOT NULL,
  `university` varchar(45) NOT NULL
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1;    

Nepotřebujete id zde, ale pokud to zjednoduší váš kód, rozhodně jej přidejte.

Krok 2, přidejte spouštěč do tabulky černých děr a zpracujte jej.

DELIMITER $$

CREATE TRIGGER bi_bh_donations BEFORE INSERT ON bh_donations FOR EACH ROW
BEGIN
  DECLARE mydonater_id integer;
  DECLARE myfundraiser_id integer;

  SELECT f.id INTO myfundraiser_id FROM fundraiser f 
    WHERE f.name = new.fundraiser_name LIMIT 1;

  IF f.id IS NULL THEN BEGIN
    SELECT error_fundraiser_is_unknown FROM table_error;
  END; END IF;

  SELECT d.id INTO mydonator_id FROM donator d
    WHERE d.name = new.name AND d.sex = new.sex AND d.university = new.university
  LIMIT 1;

  IF mydonator_id IS NULL THEN BEGIN 
    INSERT INTO donator (name, sex, university)
    VALUES (new.name, new.sex, new,university);
  END; END IF;

  SELECT LAST_INSERT_ID() INTO mydonator_id;

  INSERT INTO donation (fundraiser_id, donation_amount, donator_id)
    VALUES (myfundraiser_id, new.amount, mydonater_id); 
END$$

DELIMITER ;

Krok 3 použijte k importu dat LOAD DATA INFILE

LOAD DATA INFILE 'data.csv' INTO TABLE bh_donations
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Nyní můžete pouze načíst řádky Excelu do tabulky blackhole uložením souboru Excel jako CSV.
A pomocí LOAD DATA INFILE načíst data do tabulky černých děr.

Viz:blackhole tabulky:http://dev. mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html
další blackhole:Kreativní využití pro blackhole engine
spouštěče:http://dev.mysql.com /doc/refman/5.5/en/triggers.html
načíst vstupní datový soubor:http://dev .mysql.com/doc/refman/5.5/en/load-data.html

Doufám, že to pomůže.



  1. Získání maximální hodnoty z řádků a připojení k jiné tabulce

  2. Jak vypsat všechny uživatele v PostgreSQL

  3. PHP - MySQL připravilo příkaz pro INSERT pole

  4. ECHO ZOBRAZENÍ VÝSLEDKŮ MYSQL PRÁZDNÁ STRÁNKA