How ignore error when the data is replaced in mySQL? - mysql

I insert data into the table as follows:
REPLACE INTO `test`(`id`,`text`) VALUES (1,'first'), (2, 'second'), (3, 'third')
But if one of the sets of data is incorrect, then all the other sets do not fall into the table.
REPLACE INTO `test`(`id`,`text`) VALUES (1,'new first'), (2, NULL), (3, 'new third')
How to achieve the following:
The first and third set of data is to replace the existing data in the table. And the second is to be ignored, and the data in the table should not change.

Try
insert ignore INTO `test`(`id`,`text`) VALUES (1,'new first'), (2, NULL), (3, 'new third')
insert ignore command work as replace command but it convert errors into warning.

Related

MySql Insert multiple and Ignore duplicate records

I have this MySQL INSERT query that adds a Product to multiple categories:
INSERT INTO _categories_products (product_id, category_id) VALUES (1, 14), (1, 8), (1, 1), (1, 22);
This works great, however, if I add the same product to another subcategory from the same parent, it will create duplicate records for the parent categories:
INSERT INTO _categories_products (product_id, category_id) VALUES (1, 14), (1, 8), (1, 1), (1, 23);
Question: What would be the appropriate MySQL query that Ignores the insertion of duplicate records? In other words, the second query should INSERT only one record: 1, 23.
I tried also INSERT IGNORE INTO but nothing changed.
Thank You!
To start with, you want to create a unique constraint on categories/product tuples to avoid duplicates:
alter table _categories_products
add constraint _categories_products _bk
unique (product_id, category_id);
From that point on, an attempt to insert duplicates in the table would, by default, raise an error. You can trap and manage that error with MySQL on duplicate key syntax:
insert into _categories_products (product_id, category_id)
values (1, 14), (1, 8), (1, 1), (1, 23)
on duplicate key update product_id = values(product_id)
In the case of duplicate, the above query performs a dumb update on product_id, which actually turns the insert to a no-op.

Column count doesn't match value count in MySQL

Whenever I am trying to insert data in table:
INSERT INTO `operator`(`id`, `operator_name`, `email`, `info`)
VALUES (1,'Bangalink','This is all about Banglalink'),
(2, 'Robi', 'This is all about Robi');
MySQL said:#1136 - Column count doesn't match value count at row 1
How can i fix it?
I don't understand what need to do.
TIA
The provided number of columns in the column list specification and number of column values in each record must match.
Assuming you don't want to insert email data, remove that from the column list:
INSERT INTO `operator`(`id`, `operator_name`, `info`)
VALUES (1,'Bangalink','This is all about Banglalink'),
(2, 'Robi', 'This is all about Robi');
or pass null for email:
INSERT INTO `operator`(`id`, `operator_name`, `email`, `info`)
VALUES (1,'Bangalink',null,'This is all about Banglalink'),
(2, 'Robi', null,'This is all about Robi');
Second method is useful when you may have emails for few records.
You pass one item - info:
INSERT INTO `operator`(`id`, `operator_name`, `email`, `info`)
VALUES (1,'Bangalink','This is all about Banglalink', NULL),
(2, 'Robi', 'This is all about Robi',NULL);
or
INSERT INTO `operator`(`id`, `operator_name`, `email`)
VALUES (1,'Bangalink','This is all about Banglalink'),
(2, 'Robi', 'This is all about Robi');

How do I Use Wildcard (%) to Search but not include spaces?

I have a list of comma separated tags in a column in my database. I was using a simple wildcard to pull items that matches a tag that I was searching for. However, I have discovered that some tags are included as part of a title for other tags and that they are being returned also. For example, searching for hunting these rows might be returned:
hunting, fishing, outdoors <-- Should be returned
sporting goods, hunting <-- Should be returned
bargain hunting, sale <-- Should NOT be returned
bullets, guns, hunting <-- Should be returned
Currently I am using:
WHERE column LIKE '%hunting%'
What should I do to make this work more appropriately with these comma seperated lists. Also, please bear in mind that some rows may have only one tag and hence have no commas at all. Thanks.
Without using regular expressions:
WHERE column LIKE '%, hunting'
OR column LIKE '%, hunting,%'
OR column LIKE 'hunting, %'
See a demo
The solution here is to normalize your table.
CREATE TABLE products
(`id` int, `name` varchar(4));
INSERT INTO products
(`id`, `name`)
VALUES
(1, 'gun'),
(2, 'fish');
CREATE TABLE keywords
(`id` int, `keyword` varchar(15));
INSERT INTO keywords
(`id`, `keyword`)
VALUES
(1, 'hunting'),
(2, 'fishing'),
(3, 'outdoors'),
(4, 'sporting goods'),
(5, 'bargain hunting'),
(6, 'sale'),
(7, 'bullets'),
(8, 'guns');
CREATE TABLE productKeywords
(`productId` int, `keywordId` int);
INSERT INTO productKeywords
(`productId`, `keywordId`)
VALUES
(1, 1),
(1, 3),
(1, 4),
(2, 2),
(2, 5);
select * from Table1
where find_in_set('hunting',`text`)
or find_in_set(' hunting',`text`)
SAMPLE FIDDLE
Use RLIKE with the appropriate regex:
WHERE column RLIKE '(^|, )hunting(,|$)'
See an SQLFiddle live demo of this condition working correctly with the sample input from the question.

How long should inserting 150K rows take in mysql?

So I am inserting dummy data into my application.
I have insert statements that look like this:
INSERT INTO `submission_tagged` (1, 4);
INSERT INTO `submission_tagged` (1, 6);
INSERT INTO `submission_tagged` (1, 11);
INSERT INTO `submission_tagged` (2, 6);
INSERT INTO `submission_tagged` (2, 15);
INSERT INTO `submission_tagged` (2, 19);
150,000 of them to be precise; The insertion seems to be taking it's time; but they are obviously rather simple inserts, so I am wondering How long I should expect this to take if it will take a while I will cancel the insert and change the dummy data script to generate bulk insert statements...
Local server; so other traffic.
You can insert multiple rows at once, like:
INSERT INTO `submission_tagged` (1, 4), (1, 6)...
But check out docs for you RDBMS how many records at once it can handle. Seems that 1000 will work. That'l be much faster than inserting single row per query
Try doing them as a single INSERT:
INSERT INTO `submission_tagged` VALUES (1, 4), (1, 6), (1, 11), ...

MySQL: Conditional INSERT ... SELECT for multiple rows with constant values

I know how to insert multiple rows with constant values in a single query:
INSERT INTO table
VALUES
(1, 'a', 'x'),
(2, 'b', 'y'),
(3, 'c', 'z');
But how do I do this conditionally? I want to make sure only non-existing* rows get inserted. Is it even possible to do it in a single query?
*A row exists when all its columns are identical to the one we are inserting
Use INSERT IGNORE INTO instead of INSERT INTO. The former will only insert rows, if no unique key constraints are violated.
INSERT IGNORE INTO table
VALUES
(1, 'a', 'x'),
(2, 'b', 'y'),
(3, 'c', 'z');