Je suis TRING pour faire cela
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;
5 Réponses :
INSERT INTO blogs (title, lan) SELECT * FROM tmptable;
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
pas de table temporaire nécessaire.
INSERT INTO blogs (lan, col1, col2, col3, ...) SELECT 1, col1, col2, col3, ... FROM blogs WHERE lan = 2
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!
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.
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;
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;
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?