- Home
- Categorie
- Coding e Sistemistica
- Coding
- Copia tabella su altra tabella
-
BRAVISSIMO!!! funziona..perfetto!
ora pero ho ripristinato la tabella weborders_clienti che ha il nome dei campi diverso, come ad esempio quello della mail che è "Email" mentre quello della tabella weborderr_users è "email" e quando lancio lo script mi dà questo errore: INSERT INTO weborders_clienti (Email) SELECT email FROM weborders_users WHERE email!=' 'Duplicate entry '' for key 2
e cmq però mi copia la prima email della lista weborders_users nella tabella weborders_clienti.cmq grazie per quanto fatto che non è poco, se hai altro tempo da dedicarmi ne sarò felice....ciao grazie Peter
-
hai impostato qualche chiave nella tabella?
-
@ienavr said:
hai impostato qualche chiave nella tabella?
-- Struttura della tabella
weborders_clienti
CREATE TABLE
weborders_clienti
(
idCliente
int(6) unsigned NOT NULL auto_increment,
Nome
tinytext NOT NULL,
Cognome
tinytext NOT NULL,
NomeUtente
varchar(16) NOT NULL default '',
Password
varchar(20) NOT NULL default '',
PI_CF
tinytext,
Telefono
varchar(20) default NULL,
Email
varchar(100) NOT NULL default '',
Indirizzo
tinytext,
NCivico
tinytext,
Cap
tinytext,
Citta
tinytext,
Provincia
tinytext,
Societa
tinytext,
Consegna
int(1) default '0',
Pagamento
int(1) default '0',
Fattura
int(1) default '0',
Attivo
int(1) unsigned default '1',
PRIMARY KEY (idCliente
),
UNIQUE KEYNomeUtente
(NomeUtente
),
FULLTEXT KEYIndirizzo
(Indirizzo
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=391 ;questa è la tabella dove andrebbero copiati i dati della tabella weborders_users
-
UNIQUE KEY
NomeUtente
(NomeUtente
) significa che nella tabella non ci possono essere due utenti con lo stesso nome (anche se gli altri campi sono diversi). Nella tabella originale i nomi sono tutti distinti?
-
la tabella weborders_users dove devo prendere i dati è per la cronaca la tabella di registrazione di Joomla:
-- Struttura della tabella
weborders_users
CREATE TABLE
weborders_users
(
id
int(11) NOT NULL auto_increment,
name
varchar(50) NOT NULL default '',
username
varchar(25) NOT NULL default '',
email
varchar(100) NOT NULL,
password
varchar(100) NOT NULL default '',
usertype
varchar(25) NOT NULL default '',
block
tinyint(4) NOT NULL default '0',
sendEmail
tinyint(4) default '0',
gid
tinyint(3) unsigned NOT NULL default '1',
registerDate
datetime NOT NULL default '0000-00-00 00:00:00',
lastvisitDate
datetime NOT NULL default '0000-00-00 00:00:00',
activation
varchar(100) NOT NULL default '',
params
text NOT NULL,
PRIMARY KEY (id
),
KEYusertype
(usertype
),
KEYidx_name
(name
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=190 ;
-
nella tabella weborders_users ci possono essere 2 utenti con lo stesso username? scusa la domanda un po' idiota...
-
ok! sembra che fino a qui ci siamo:
$query = "INSERT INTO weborders_clienti (Nome,NomeUtente,Email,Password) SELECT name,username,email,password FROM weborders_users WHERE id!=' '";
ora se io devo prendere qualche altro dato tipo "citta" "telefono" ecc. da anche un'altra tabella, quindi oltre a "weborders_users" anche da "weborders_comprofiler" come dovrei inserirla nella query?
Un'altro piccolo problema è quello di non riscrivere dati gia esistenti!!!!!
ciao e sempre grazie tantissimo da Peter
-
scusa ma come hai risolto il problema di prima?
ad ogni modo ora devi usare un join...
-
scusa ma credo che non ho inviato il post ...cmq dicevo di aver eliminato sul DB la chiave UNIQUE KEY
NomeUtente
(NomeUtente
)ora cmq il primo passo è quello di non riscrivere i dati due volte!
-
non garantisco perchè non ho potuto testare...però è un tentativo...INSERT INTO weborders_clienti
(Nome,NomeUtente,Email,Password)
SELECT u.name,u.username,u.email,u.password
FROM weborders_users AS u WHERE u.id!='' AND u.username
IN ( SELECT DISTINCT username FROM weborders_users )
-
No nulla!...li ripete come prima
-
mi chiedevo se invece si potrebbe inserire sotto un'altra query che eliminasse i dati doppi nella cartella di destinazione "weborders_clienti"
inoltre ho trovato questo:
Oltre alla INSERT, MySQL offre l'istruzione **REPLACE**, che è un'estensione allo standard SQL e che consente di sostituire le righe preesistenti con le righe inserite qualora si verifichi una situazione di chiave doppia. In pratica, usando REPLACE, qualora non sia possibile inserire una riga perchè una PRIMARY KEY o un indice UNIQUE esistono già sulla tabella, MySQL cancella la riga vecchia ed inserisce la nuova. Questo comportamento è opposto a quello di INSERT IGNORE, con il quale è la nuova riga ad essere scartata. Per effettuare una REPLACE dovremo avere i permessi di INSERT e DELETE; le sintassi sono pressochè identiche a quelle della INSERT; vediamole: REPLACE [LOW_PRIORITY | DELAYED] [INTO] *nome_tabella* [(*nome_colonna*,...)] VALUES ({*espressione* | DEFAULT},...),(...),... **oppure** REPLACE [LOW_PRIORITY | DELAYED] [INTO] *nome_tabella* SET *nome_colonna*={*espressione* | DEFAULT}, ... **oppure** REPLACE [LOW_PRIORITY | DELAYED] [INTO] *nome_tabella* [(*nome_colonna*,...)] SELECT ...
fonte: http://database.html.it/guide/lezione/2448/inserimento-dei-dati-nelle-tabelle/
-
forse allora ti conveniva tenere la chiave unique su username ed utilizzare "insert ignore" invece di "insert"
-
Ok ora provo
-
@peterminnow said:
Ok ora provo
è tutto ok con questa:$query = "INSERT IGNORE INTO weborders_clienti (idCliente,Nome,NomeUtente,Email,Password) SELECT id,name,username,email,password FROM weborders_users WHERE id!=' '";
ora come ultimo problema come dicevo prima è prendere qualche dato anche da un'altra tabella "weborders_comprofiler" da inserire sempre nella tabella "weborders_clienti"
oltre a rigraziarti davvero tantissimo, vorrei darti ovviamente, dopo tanto lavoro, il motivo per il quale mi serve di replicare alcuni dati di _users e _comprofiler in _clienti, il quale è che quella tabella viene letta da un software (chiuso) non modificabile!
ciao..nel frattempo continuo a trovare soluzione per quanto sopra......ma se hai tempo sicuramente la soluzione se tu!
-
se mi dici qual è la chiave che accomuna i campi delle due tabelle ti scrivo il codice
-
La tabella weborders_clienti
Nome,Cognome,NomeUtente,Password,PI_CF,Telefono,Email,Indirizzo,NCivico,Cap,Citta,Provincia,Societa,Consegna,Pagamento,Fattura,Attivo
La tabella weborders_users
name,username,email,block
La tabella weborders_comprofiler
lastname, firstname,cb_picf,cb_telefono,cb_indirizzo,cb_cap,cb_citta,cb_provincia,cd_societa,cb_fattura,cb_consegna,cb_pagamenti
-
ci deve essere un campo comune alle 2 tabelle cmprofiler e users per poter fare un join...cioè un campo che identifichi univocamente uno stesso utente (ad esempio) in entrambe le tabelle
-
si hai ragione la tabella "weborders_users" ha un id con stessa numerazione dell'**id **nella tabella "weborders_comprofiler"
inoltre questa ultima tabella ha anche un campo di nome **user_id **che riporta la stessa nemerazione dei precedenti **id
**a cosa potrebbe servire a Jooomla questo non lo so!
-
se ho capito bene ti serve una cosa del genere:
$query = "INSERT IGNORE INTO weborders_clienti (idCliente,Nome,NomeUtente,Email,Password,Indirizzo) SELECT u.id,name,u.username,u.email,u.password,c.cb_indirizzo FROM weborders_users AS u INNER JOIN weborders_comprofiler AS c ON u.id = c.id WHERE u.id!=' '";
questa è la struttura e credo vada bene...poi la devi personalizzare chiaramente