7
votes

Dupliquer toutes les lignes dans une table et empêcher les clés en double

Je suis TRING pour faire cela

  • Obtenez toutes les lignes dans un blogs nommé table. Li>
  • copiez-les dans une base de données temporaire li>
  • Modifier le champ Langue de cet enregistrement de la table temporaire LI>
  • Insérer dans la table des blogs li> ul>

    et j'essaye comme ça: P>

    CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
    UPDATE tmptable SET lan = 1;
    UPDATE tmptable SET id = id + (SELECT id FROM blogs ORDER BY id DESC LIMIT 1);
    INSERT INTO blogs SELECT * FROM tmptable;
    


3 commentaires

L'ID de la table des blogs est une identité?


c'est la clé primaire, unique et autocrampe. Oui!


Pourquoi ne pas simplement modifier votre déclaration d'insertion à utiliser sur la mise à jour de la clé en double?


5 Réponses :


1
votes
INSERT INTO blogs (title, lan) SELECT * FROM tmptable;

1 commentaires

NOOOOOO ... Je ne veux pas changer de langue, je souhaite enregistrer une autre copie de tous les enregistrements et asignez ceci copies une langue différente



16
votes

pas de table temporaire nécessaire.

INSERT INTO blogs (lan, col1, col2, col3, ...)
SELECT 1, col1, col2, col3, ...
FROM blogs
WHERE lan = 2


3 commentaires

Est-ce quelque chose que vous devez faire souvent? Votre schéma de table change-t-il beaucoup? Si tel est le cas, vous pouvez écrire une procédure stockée qui génère la SQL de manière dynamique de l'information_schema.


Les outils / concepteurs de requêtes visuelles permettront à SQL pour vous qui inclut une liste de tous les champs en quelques clics. Peut alors couper / coller au besoin pour faire votre insertion, etc.


Je veux juste dire merci d'être un non-conformiste et de penser vraiment à la solution la plus appropriée!



4
votes
CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
UPDATE tmptable SET lan = 1;
alter table tmptable drop column id;
INSERT INTO blogs SELECT NULL,tmptable.* FROM tmptable;
Assumed, the column "id" is the first col.

0 commentaires

0
votes

Utilisation de l'instruction préparée Vous pouvez interroger le schéma d'informations de la colonne que vous souhaitez utiliser, puis forger la requête que vous souhaitez exécuter:

Voici un exemple de votre cas: P>

-- first query all the blogs column minus id and lan

SELECT GROUP_CONCAT(c.COLUMN_NAME)
INTO @cols
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE
 c.TABLE_NAME = 'blogs'
 AND c.COLUMN_NAME not in ('id', 'lan');

-- second build the query with the gathered columns
-- like INSERT INTO blogs(lan, col1, ...) SELECT 2, col1, ... FROM blogs WHERE lan=1

SET @sql=CONCAT(CONCAT(CONCAT(CONCAT('INSERT INTO blogs (lan,', @cols), 
                ') SELECT 2,'), @cols), ' FROM blogs WHERE lan=1');

-- prepare the statement    
PREPARE stmt FROM @sql;

-- and last run the insert
EXECUTE stmt;


0 commentaires

1
votes

S'il vous plaît essayez de suivre SQL. Une similaire SQL FIDDLE

 CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
    UPDATE tmptable SET lan = 1;
    UPDATE tmptable SET id = (select @val:=@val+1 from(select @val:=(select max(id) from blogs)) t)
    INSERT INTO blogs SELECT * FROM tmptable;


0 commentaires