Kom ihåg mig?
Home Menu

Menu


Hjälp med att skapa MySQL procedure

 
Ämnesverktyg Visningsalternativ
Gammal 2010-12-18, 13:36 #1
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Jag skulle gissa att TS har för avsikt att använda tabellen Name med unika namn men att tabellen Person kan gha flera likadana referenser till namn i Namn-trabelen, det kan ju finnas en Nisse som är 23 år och en som är 35 exempelvis.

Tabellen person behöver troligen byggas ut så att man separerar för och efternamn samt att man byter age mot BirthYear samt att man har ytterligare kolumner för at särskilja de olika personerna. Men en början är att ha en Stored Procedure som ser ut så här:

Jag har också ändrat namnet på aelanders SP så namnet återspeglar vad man egentligen vill göra med SPn, dvs lägga till en person med namn och ålder. Men att namnets klartext endast ska sparas en gång för att bland annat spara utrymme.

Om du lägger in både förnamn och efternamn i kolumnen namn så kommer utrymmesbesparingen att vara obetydlig jämfört om du delar upp förnamn och efternamn i varsin kolumn.

Just i detta fall passar det inte att använda en TRIGGER.

Kod:
-- Följande tabelldefintioner har jag använt:
delimiter $$

CREATE TABLE `name` 
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=latin1$$


delimiter $$

CREATE TABLE `person` 
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` int(11) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1$$


Kod:
DELIMITER //
//
DROP PROCEDURE IF EXISTS addPerson;
//
delimiter //
create procedure addPerson(Namn tinytext, age int(11))
begin
  declare chk int default 0;
  select count(*) from Name where Name = Namn into chk;
  if chk = 0 then
    insert into Name (Name) values (Namn);
    insert into Person (Name, age) values (last_insert_id(), age);
  else
    -- Om tanken med proceduren är att man ska kunna lägga till alla personer i 
    -- Persontabellen oavsett om namnet finns sedan tidigare men inga dubbletter
    -- i name-tabellen så ska även denna insert-sats med, kanske bör fler villkor 
    -- byggas till för att det ska bli en vettig funktionalitet.
    insert into Person (Name, age) values ((select id from name where name=Namn), age);
  end if;
end
//

delimiter ;

Kod:
-- Uppläggning av testdata
CALL addPerson('Nisse', 23);
CALL addPerson('Anders', 34);
CALL addPerson('Barak', 36);

CALL addPerson('Nisse', 33);
CALL addPerson('Anders', 44);
CALL addPerson('Barak', 46);

CALL addPerson('Nisse', 43);
CALL addPerson('Anders', 54);
CALL addPerson('Barak', 56);
Kod:
-- Visa innehållet i tabellerna efter att man kört SPn

-- Endast 3 förekomster/tupler i Name-tabellen
select * from Name order by name; 

-- Men hela 9 förekomster/tupler i Persontabellen
SELECT    p.id, n.name, p.age  
FROM       Person p, name n 
WHERE     p.name=n.id
ORDER BY name;
Kod:
-- Här även en View så man enkelt kan presetera värden från Persontabellen genom att skriva:
-- SELECT * FROM Person_view 
-- ...i stället för en krånglig SQL-sats...
delimiter //

CREATE VIEW `person_view` AS 
select `p`.`id` AS `id`,`n`.`name` AS `name`,`p`.`age` AS `age` 
from (`person` `p` join `name` `n`) 
where (`p`.`name` = `n`.`id`) 
order by `n`.`name`

//

Senast redigerad av Conny Westh den 2010-12-20 klockan 05:54
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-18, 15:25 #2
aelanders avatar
aelander aelander är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 146
aelander aelander är inte uppkopplad
Medlem
aelanders avatar
 
Reg.datum: Dec 2004
Inlägg: 146
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Jag skulle gissa att TS har för avsikt att använda tabellen Name med unika namn men att tabellen Person kan gha flera likadana referenser till namn i Namn-tabellen, det kan ju finnas en Nisse som är 23 år och en som är 35 exempelvis.

Tabellen person behöver troligen byggas ut så att man separerar för och efternamn samt att man byter age mot BirthYear samt att man har ytterligare kolumner för at särskilja de olika personerna.
Goda synpunkter!

Jag förmodar att du menar att man ser till att man endast har exvis en Nisse, en Barak osv i tabellen.

Men man stöter ju på lite problem när man delar för- och efternamn. Tänk att man lägger till
Nisse Karlsson
Nisse Andersson
Per Karlsson

Hur gör man för att ha "äkta relationer". Blir dessa tre personer lika med tre poster i tabellen Name?

Kanske man i så fall borde ha två tabeller
FirstName
LastName
Eller det går att lösa på annat sätt?


Nästa problem är när man har dubbelnamn med blanksteg mellan namnen.
Nils Petter Sundgren
http://sv.wikipedia.org/wiki/Nils_Petter_Sundgren

Elisabeth Tarras Wahlberg
http://sv.wikipedia.org/wiki/Elisabeth_Tarras-Wahlberg
Nu skriver ju detta som Elisabeth Tarras-Wahlberg, men jag kom inte på nåt annat exempel.

Ganska omöjligt att automatisk avgöra vilket som är för- resp efternamn.
Kan ju lösas med två inmatningsfält !

som parantes:
För övrigt tycker jag att detta är en diskussion som leder saker framåt till skillnad mot
de flesta inlägg under webbhotell, se http://www.wn.se/t1045305.html
slut parantes.

Skulle vilja att mojitoo mer konkret beskrev vad som ska göras.
aelander är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 06:51.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017