Avatar billede bizty Nybegynder
09. oktober 2007 - 21:47 Der er 15 kommentarer og
2 løsninger

Hjælp til sætning

Jeg har en tabel med bl.a. felterne content_id, prop_name og content.
content_id og prop_name danner en unik nøgle.
Jeg vil gerne gøre følgende: vælge alle rækker hvor prop_name='content_dk', ændre prop_name til 'content_no' for de valgte rækker, indsætte de valgte (og rettede) rækker i samme tabel som de kom fra (altså så de oprindelige rækker ikke ændre, men snarere kopieres). Hvordan kan jeg gøre dette?

Mit eget gæt er at det skal være en update inden i en select eller noget....?

Please help.
Avatar billede dkfire Nybegynder
09. oktober 2007 - 22:43 #1
Tror ikke du skal lave en update, den vil bare ændre dine nuværende værdier og ikke indsætte nogle nye som du gerne vil. Du skal derimod lave en insert, hvor du henter værdierne fra din egen tabel.
Jeg har prøvet noget her, men er bestemt ikke sikker på det virker, måske du skal få  din kode til selv at indsætte en nye værdier.
Prøv :
INSERT INTO tabel ( prop_name, content ) VALUES ( 'content_no', (SELECT content FROM tabel WHERE prop_name='content_dk') )

Eller må vi jo gøre noget andet. Husk også lige at skrive din tabelnavn, det gør det lidt nemmere at lave et eksempel :-)
Avatar billede bizty Nybegynder
09. oktober 2007 - 23:04 #2
Tabellen hedder cms_content_props.

Jeg prøver følgende, men phpMyAdmin skriver syntaxfejl uden at forklare nærmere.

INSERT INTO cms_content_props ( prop_name, content, content_id ) VALUES ( 'content_no', (SELECT content, content_id FROM cms_content_props WHERE prop_name='content_dk') )

Andre ideer?
Avatar billede dkfire Nybegynder
09. oktober 2007 - 23:21 #3
Er content_id ikke en primærnøgle ??
Avatar billede bizty Nybegynder
09. oktober 2007 - 23:29 #4
nej content_id er ikke primær nøgle. Det er (content_id, prop_name).
Avatar billede dkfire Nybegynder
09. oktober 2007 - 23:35 #5
Du kan ikke have to primærnøgler, du kan dog godt have flere index'er.
Hvordan ser din tabel ud ??
Prøv at lave en:
DESCRIBE cms_content_props
Avatar billede bizty Nybegynder
09. oktober 2007 - 23:39 #6
Det jeg mener er bare at det er kombinationen af content_id og prop_name som er unik.

SQL-forespørgsel: describe cms_content_props;
Rækker: 9

Field    Type    Null    Key    Default    Extra
content_id    int(11)    YES    MUL    NULL   
type    varchar(25)    YES        NULL   
prop_name    varchar(255)    YES        NULL   
param1    varchar(255)    YES        NULL   
param2    varchar(255)    YES        NULL   
param3    varchar(255)    YES        NULL   
content    text    YES        NULL   
create_date    datetime    YES        NULL   
modified_date    datetime    YES        NULL
Avatar billede dkfire Nybegynder
09. oktober 2007 - 23:46 #7
Se det eneste du har er en index på content_id, og du har ingen primærnølger
Avatar billede dkfire Nybegynder
09. oktober 2007 - 23:50 #8
Kan være vi bliver nød til at lave en stored procedure for at klare det.
Avatar billede dkfire Nybegynder
09. oktober 2007 - 23:51 #9
Men nu ved jeg jo ikke lige hvad alle de andre felter i din tabel skal indeholde, type samt mange af de andre skal vel også have et indhold.
Avatar billede bizty Nybegynder
09. oktober 2007 - 23:56 #10
de andre felters indhold er ikke så vigtigt. De skal helst bare kopieres fra de oprindelige rækker.  Man kunne vel også selecte rækkerne ind i en midlertidig tabel. Køre update på prop_name feltet og så selecte alle rækkerne tilbage til den oprindelige tabel?
Avatar billede dkfire Nybegynder
10. oktober 2007 - 00:10 #11
Ja det kunne man, eller man kunne lige lave en procedure som gør det hele på en gang.
Prøv med:

delimiter //

create procedure update_cms()
begin
  declare this_id int;
  declare this_content text;
  declare this_type varchar(255);
  declare this_param1 varchar(255);
  declare this_param2 varchar(255);
  declare this_param3 varchar(255);

  declare done int default 0;
  declare continue handler for sqlstate '02000' set done = 1;
  declare c1 curcor for SELECT content_id, type, param1, param2, param3, content FROM cms_content_props WHERE prop_name='content_dk';
 
  open c1
  repeat
    fetch c1 into this_id, this_type, this_param1, this_param2, this_param3, this_content;
    insert into cms_content_props ( content_id, type, param1, param2, param3, content
Avatar billede dkfire Nybegynder
10. oktober 2007 - 00:10 #12
Hmm ikke helt rigtig. prøver lige igen.
Avatar billede dkfire Nybegynder
10. oktober 2007 - 00:17 #13
delimiter //

create procedure update_cms()
begin
  declare this_id int;
  declare this_content text;
  declare this_type varchar(255);
  declare this_param1 varchar(255);
  declare this_param2 varchar(255);
  declare this_param3 varchar(255);

  declare done int default 0;
  declare continue handler for sqlstate '02000' set done = 1;
  declare c1 curcor for SELECT content_id, type, param1, param2, param3, content FROM cms_content_props WHERE prop_name='content_dk';

  open c1
  repeat
    fetch c1 into this_id, this_type, this_param1, this_param2, this_param3, this_content;
    insert into cms_content_props ( content_id, type, prop_name, param1, param2, param3, content, create_date, modified_date ) VALUES ( this_id, this_type, 'content_no', this_param1, this_param2, this_param3, this_content, NOW(), NOW() );
  until done end repeat;
  close c1;
end
//

delimiter ;




Men husk lige at tage en backup, så du altid kan komme tilbage hvis dette ikke virker.
Vi mangler lige en ting til, men lad mig lige vide om dette jeg har skrevet virker.
Håber du har mysql version 5, ellers kommer det aldrig til at virke :-)
Avatar billede kjulius Novice
10. oktober 2007 - 17:11 #14
Måske har du prøvet det, men for mig at se burde en simpel

INSERT INTO cms_content_props
SELECT content_id, type, 'content_no', param1, param2, param3, content, create_date, modified_date FROM cms_content_props WHERE prop_name='content_dk'

kunne gøre det...
Avatar billede bizty Nybegynder
10. oktober 2007 - 17:24 #15
Kjulius >> Det virker som det jeg ledte efter, men jeg løste det selv ved at trække rækkerne over i en midlertidig tabel.

dkfire >> Jeg bruger desværre mySql 4 så stored procedure var ikke en mulighed.

Tak for hjælpen begge to. Jeg foreslår at I deler point.
Avatar billede kjulius Novice
11. oktober 2007 - 03:08 #16
OK :-)
Avatar billede dkfire Nybegynder
11. oktober 2007 - 10:23 #17
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester