MySQL- get id of next insert - mysql

I am building a system whereby the user can build pages for a blog. The pages can contain images which obviously require manipulation and storage in folders. I am using the id of the SQL table row where the page data is stored as the basis for the folder name which stores the images for that page. The trouble is, sometimes this folder has to be created BEFORE the other page data has been inserted into the SQL table.
SO... how do I find what the ID of the NEXT insert will be?
I can't use the SELECT MAX(id) + 1 because pages may have been deleted in the meantime, reducing the max ID.
Any ideas? I am using codeigniter, so if anyone knows a library or method in CI that deals with this problem, that'd be ideal.
I COULD insert a dummy row, get the ID, delete it, then add one to the value, but seems like a bit of a hack?
Thanks

Try using LAST_INSERT_ID() function.

Related

Laravel how to retrieve the recently uploaded values

I have a database in mysql. I upload a set of data to the database table from a .csv file or .xls file. During retrieval I need to retrieve only the set of values which I have recently uploaded to the table in the database. I should not get all the values which stored in the table.(only values recently uploaded to the table should be retrieved). How can I do that using Laravel?
(1)
In the table where you store the data from CSV and XML, using a migration, create a flag to mark the records you didn't process yet, e.g. is_processed. Give it the default value of 0.
(2)
If you have data you already retrieved (processed), set those to 1, so they don't get processed again. You can do this manually with a query, based on the conditions that make sense in your case.
(3)
Then, after you store new data, they will be automatically set to is_processed = 0. This means you can identify them afterwards, like this:
$unprocessedData = MyModel::where('is_processed', 0)->get();
You can also order them if you need to, but - in general - that's the approach I would take.
Lets say you have a table/model named Users;
$getLatestUsers=Users::orderBy('created_at','desc')->take(5)->get();
this will take 5 recent records from database.
Well it depends on what you consider "recent" but you could tweak a function like this to fit your needs:
->where('created_at', '<', Carbon::now()->subMinutes(5)->toDateTimeString())
This would retrieve the elements created the last 5 minutes, but Carbon offers a wide variety of substractors.
PD: Remember to add use Carbon\Carbon; under your namespace declaration.
Hope this helps you.
$latest= Users::orderBy('created_at','desc')->take(10)->get();
this will return 10 recent values

Why are my records not being inserted in the same order they are being executed?

I'm using Microsoft Office Access as my DBMS and I'm using VBA to write my code for this project.
I'm doing data scraping for items on a website and I encountered something that appeared odd to me after I had inserted my data into a table.
In my code I use a loop to iterate through and collect all the items that the website has to offer. Once I have all the data for one item I insert it into my table and then move on to the next. There's 14,724 items that I need to insert into my table. If I iterate over all of them, they will be added to the table but they are out of order once I look at them in the table, even though all the items are there, however if I adjust the loop to only collect...let's say only the first 10 items then they will appear in the same order in which they were collected which is the same order they appear in the source code for the website.
It is important to note that my table does not have an id field because it is not required as there's one other field that serves as a unique identifier for an item in the table.
This does not seem like a big issue but I'm curious as to why this happens. Is there some kind of limitation when using MS-Access as your DBMS?
Any insight is greatly appreciated.
Thank you.
A table is not a spreadsheet.
This is by design of any relational database engine. Records in a table have no order other than what you eventually assign or apply.
If you want to sort the data (ascending or descending) use a Query. The Table doesn't have any order. Even the Fields don't have any relevant order.

Access VBA to find & move recurring value

Good Morning,
I'm fairly new to Access VBA and I've been trying to find a solution to a problem:
I've created a form from which users upload an excel file to a database. File open prompt appears, user selects the file, temp table gets created and data gets pulled to this table. From there a set of macros populate the required fields and push the complete set to a perm table and then temp table gets deleted. Now I would like to take it a step further and try and count how many times a value has been uploaded to the table...
Lets say that the value appears in the table twice already, then if user tries to upload the same value for the third time it will be uploaded to a different table. Bear in mind that the file which users will upload may contain values that will be uploaded for the first, second, third, etc. time.
Do you have any suggestions or solutions to my problem? Is it even possible? If yes then how can I make Access to distinguish which records are being uploaded for the first, second, third, etc. time and follow appropriate paths?
I've been scouting the internet for several days now, but no one seems to have such issue.
Thank you in advance for replies.
I'm not sure I follow. You are essentially trying to prevent inserting duplicate data to a production table and if a duplicate is encountered at the record to a different table?

SSRS - Single page per row

Creating a report that is a display of a persons online application, so there are text boxes and multiple tables per person. I need each person to print on the same page, so a user can select either a particular application, or a date range, like all applications for today and yesterday. I currently have everything in a LIST object with a page break set on it, however the tables in the LIST would throw the "detail member with inner members" error. I found a a way around that using the solution here: http://blogs.lessthandot.com/index.php/datamgmt/dbprogramming/reporting-services-error-the-tablix/ , which got rid of the error, but any multiple row tables return a new row per page, so a person with 3 aliases, will have a 3 page report. So, I am looking for a new tutorial on how to keep everything on one page, but allow my tables to return all results on the same page. Thanks.
I don't know if you are writing the query out or using a stored procedure. If you are using a stored procedure if would make it a lot easier to use SSRS. But to get the grouping correct find a common record between the user and the aliases. Then be sure to pull that common identifier into the stored procedure. Then use the table wizard and pull in all the information you want to see and pull the common identifier into the row group box and it will format for you and group that person on the common identifier and hopefully give you the results you are looking for.

Copying a record in VBA

I work with a product that comes in a 2000lb sack and placed on a pallet. When this product is made it has many different elements that are tested and each test has a field that the numerical data is placed in. Each of these records of tests are then assign a number, for example, L20444.
Now we have the ability to take that 2000lb sack and convert it into 80 20lb bags. Only 40 20lb bags can fit on one pallet, taking now the one pallet L20444 and making two pallets that have the number L20444. This causes a problem with inventory because the number L20444 can only be assign one warehouse location, not two.
So my bosses what to create a number that is almost the same, but different enough to place the second pallet in the warehouse. The second pallet will now be L20444B. It will still have all the same tested numbers and is a "copy" of the original L20444.
My question is can I take the record L20444 and copy all the data for that record and then save it as L20444B so that it can be placed in the warehouse.
So is it possible for VBA to copy a record, rename it, and then save it in the same database as a new record?
Any help would be appreciated, Thanks.
If I'm reading you right it sounds like you want a SQL statement to create a new record.
You're using Microsoft Access? I would recommend first creating a query that does this in the query editor. It will be an Append query, something along the lines of:
INSERT INTO TableA ( ID,col1, col2 )
SELECT [ID] & "B" AS NewName,col1, col2
FROM TableA
WHERE (([ID]="L20444"));
Test this first to make sure it's doing what you want, and make "L20444" into a parameter ([OldID], or something). Then add some code in your VBA script that executes this query. It should pop up asking you for OldID when you run it.
Then you'll need to learn how to execute parameterized queries from VBA.
Something like this:
Set qdf1 = CurrentDb.QueryDefs("myQuery")
qdf1.Parameters("OldID") = theOldID
qdf1.Execute
Not tested, search VBA help for QueryDefs if my syntax isn't quite right.
Why don't you create a new table, which tracks the location of the two pallets (and the new number(s)), which links back (with a foreign key) to the single record for the stock in the original table?
That should work, and will avoid what will otherwise become a nightmare of redundant data.